Unity中Dictionary转合法JSON发送至Flask服务器异常问题排查
操作疏漏明细
- 核心逻辑错误:序列化调用顺序完全颠倒
所有传入JsonConvert.SerializeObject()的参数,都是对象调用.ToString()的返回值。C#中字典类型默认的ToString()方法不会输出字典内部的键值对内容,只会返回类型签名,也就是服务器报错抛出的System.Collections.Generic.Dictionary2[System.String,System.String]`。等于全程没有把实际业务对象交给序列化器,只是把“对象的类型名称文本”做了字符串序列化,自然生成不出合法JSON结构。 - 类型定义不匹配
根JSON容器被定义为Dictionary<string, string>,但实际要存储的id数值、嵌套字典、二进制字节数据都不属于string类型,哪怕修正了ToString的问题,也会触发类型转换异常。 - 赋值链路断裂
代码中定义的变量是id_val、employeeData,但赋值环节突然引用了未声明的CalibrationJson、imagesJson,实际的业务数据根本没有写入待发送的JSON结构中。 - 二进制数据处理缺失
字节数组是二进制内容,无法直接被JSON格式承载,必须先转换为Base64字符串才能合法嵌入JSON结构,否则序列化环节会直接抛出格式错误。
修正后的可运行代码
// 根容器改为支持任意值类型的字典,不要限定值为string Dictionary<string, object> rootJson = new Dictionary<string, object>(); // 构建id嵌套对象 Dictionary<string, float> idVal = new Dictionary<string, float>(); idVal.Add("id", 1); // 构建员工数据:先把字节数组转Base64字符串 string base64Data = Convert.ToBase64String(encodedByte); Dictionary<string, string> employeeData = new Dictionary<string, string>(); employeeData.Add("employeeData", base64Data); // 直接将对象存入根容器,不要调用ToString() rootJson.Add("id", idVal); rootJson.Add("data", employeeData); // 直接序列化根对象,不要对根对象调用ToString() string requestBody = JsonConvert.SerializeObject(rootJson); StartCoroutine(Post("http://127.0.0.1:5000/emp_detail", requestBody));
原有的Post协程逻辑没有问题,只要传入上面生成的合法JSON字符串,就能正常完成和Flask服务端的POST交互。
内容的提问来源于stack exchange,提问作者user1241241
相关产品推荐
相关产品推荐

