.Net项目P1向Java项目P2传递JObject转JsonNode数据异常问题
问题场景
我维护两个项目:P1(.NET)和P2(Java)。外部POST请求先发送到P1,P1将请求反序列化后再转发给P2。
P1的C#请求实体类:
public class Request { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("type")] public string Type{ get; set; } [JsonProperty("data")] public JObject Data { get; set; } }
P2的Java请求实体类:
public class Request{ private String id; private String type; private JsonNode data; }
问题现象
- P1接收并反序列化后,请求内容完全符合预期:
id -> 3 type -> "type1" data -> {{name: "myRequest", topic: "myTopic"}} - 但转发到P2后,
data字段的内容异常,字符串值变成了空数组:id -> 3 type -> "type1" data -> {{name: [], topic: []}}
原始JSON对比
- P1收到的原始JSON:
{ "id": "1234", "type": "type1", "data": { "name": "010018", "topic": "EGYT" } }
- P1转发给P2的JSON:
{ "id": "1234", "type": "type1", "data": { "name": [], "topic": [] } }
因为data的结构会随请求类型变化,必须在P2中用JsonNode保留原始JSON结构来后续解析,所以需要修复转发时的序列化问题。
解决方案
问题根源是P1中使用了不兼容的JSON序列化方式处理JObject类型字段。JObject是Newtonsoft.Json(Json.NET)的专属类型,如果用System.Text.Json序列化会导致结构异常,将字符串值错误序列化为空数组。
方案一:改用Newtonsoft.Json序列化请求对象
在P1转发请求时,使用Newtonsoft.Json来序列化Request对象,而非System.Text.Json:
// 引用Newtonsoft.Json包 using Newtonsoft.Json; // 序列化请求对象 var serializedRequest = JsonConvert.SerializeObject(request); // 创建请求内容 var content = new StringContent(serializedRequest, Encoding.UTF8, "application/json"); // 发送到P2的请求逻辑 var httpClient = new HttpClient(); await httpClient.PostAsync("P2的接口地址", content);
方案二:将Data字段改为字符串类型(保留原始JSON)
如果不需要在P1中操作data的内容,可以直接将P1的Request类中Data字段改为string类型,直接保留原始JSON字符串,避免序列化转换的问题:
public class Request { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("type")] public string Type{ get; set; } [JsonProperty("data")] public string Data { get; set; } }
这种方式下,P1反序列化时会直接把data对应的JSON字符串保留,转发时原样输出,P2的JsonNode可以正常解析该字符串为JSON对象。
内容的提问来源于stack exchange,提问作者kyo
相关产品推荐
相关产品推荐

