Unity向SpringBoot Rest接口发送JSON时出现解析异常求助
嘿,这个错误我太熟了!你看到的HttpMessageNotReadableException里提到的'%'字符,基本上就是请求体被URL编码了,或者请求头没配置对,导致SpringBoot根本没法正确识别你发的是JSON数据。咱们一步步来排查解决:
1. 先把Unity的请求头改对
这是最常见的坑!你在Unity发POST请求的时候,一定要给请求加上Content-Type: application/json的头。如果没加这个,SpringBoot会默认把请求体当成普通表单数据处理,甚至自动给你做URL编码,自然会出现'%'这种编码字符。
给你贴个UnityWebRequest的正确示例:
// 假设你已经把用户数据转成了合法的JSON字符串 string userJson = JsonUtility.ToJson(userData); UnityWebRequest request = new UnityWebRequest("http://你的SpringBoot地址/api/user", "POST"); // 把JSON转成字节数组,直接上传原始数据 byte[] jsonBytes = Encoding.UTF8.GetBytes(userJson); request.uploadHandler = new UploadHandlerRaw(jsonBytes); request.downloadHandler = new DownloadHandlerBuffer(); // 关键!一定要加这个请求头 request.SetRequestHeader("Content-Type", "application/json"); yield return request.SendWebRequest(); // 后续处理响应...
2. 别手动给JSON做URL编码
如果你之前为了“避免特殊字符”,用了WWW.EscapeURL或者类似方法给JSON字符串做编码,赶紧删掉!SpringBoot要的是原始的JSON格式,编码后的JSON会把{}变成%7B%7D,自然会触发解析错误。
举个错误示范,千万别这么写:
// 错误!不要编码JSON string badJson = WWW.EscapeURL(userJson);
3. 检查SpringBoot的接口写法
确保你的接口方法是用@RequestBody来接收JSON的,而不是@RequestParam这种表单参数注解。比如:
@RestController @RequestMapping("/api") public class UserController { @PostMapping("/user") public ResponseEntity<String> receiveUserData(@RequestBody UserEntity user) { // 处理用户数据 return ResponseEntity.ok("接收成功"); } }
这里的UserEntity要和Unity发送的JSON字段对应上,大小写不匹配的话可以用@JsonProperty注解指定映射,比如Unity里的userName对应Java里的userName或者用@JsonProperty("userName")标注字段。
4. 验证JSON本身的合法性
最后再确认下Unity生成的JSON是不是合法的——把生成的JSON字符串打印出来,复制到随便一个JSON校验工具(本地就能弄,比如用VSCode的JSON校验)看看有没有语法错误,比如缺引号、逗号多打了之类的。有时候格式错误也会导致解析失败,只是错误提示刚好指向了编码后的字符。
如果还是搞不定,可以抓个包看看实际发送的请求体内容,确认是不是真的发了原始JSON,而不是一堆带'%'的编码字符串。
内容的提问来源于stack exchange,提问作者Eshiett

