C#中无法将嵌套Dictionary转换为JsonObject的问题
解决System.Text.Json.JsonObject无法被Newtonsoft.Json反序列化的问题
问题根源
你遇到的错误是因为Newtonsoft.Json(Json.NET)和System.Text.Json是两个独立的JSON处理库,System.Text.Json.Nodes.JsonObject没有无参构造函数,且它的实例化逻辑绑定到System.Text.Json库,Json.NET无法自动识别并创建它的实例。
解决方案(两种可选)
方案1:改用System.Text.Json生成JsonObject(推荐)
既然接口返回的是System.Text.Json.Nodes.JsonObject,直接用System.Text.Json的API构建或反序列化,完全避免跨库冲突:
var apiResponse = new Dictionary<string, Dictionary<string, string>>() { { "PAGE_NAME", new Dictionary<string, string>() { { "KEY_NAME", "LOCALE IN PARAMETER LANGUAGE" }, { "COPY_TO_CLIPBOARD", "Copy to clipboard" } } } }; // 用System.Text.Json序列化后反序列化,直接得到JsonObject var jsonString = System.Text.Json.JsonSerializer.Serialize(apiResponse); var expectedData = System.Text.Json.JsonSerializer.Deserialize<System.Text.Json.Nodes.JsonObject>(jsonString);
或者更直接,跳过序列化反序列化,直接构建JsonObject:
var expectedData = new System.Text.Json.Nodes.JsonObject { ["PAGE_NAME"] = new System.Text.Json.Nodes.JsonObject { ["KEY_NAME"] = "LOCALE IN PARAMETER LANGUAGE", ["COPY_TO_CLIPBOARD"] = "Copy to clipboard" } };
方案2:给Newtonsoft.Json写自定义转换器
如果必须保留Json.NET的序列化逻辑,需要写一个自定义转换器,告诉Json.NET如何创建JsonObject:
public class JsonObjectConverter : Newtonsoft.Json.JsonConverter<System.Text.Json.Nodes.JsonObject> { public override System.Text.Json.Nodes.JsonObject ReadJson(JsonReader reader, Type objectType, System.Text.Json.Nodes.JsonObject existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) { // 先读取Json.NET的JObject,再转成System.Text.Json的JsonObject var jObject = Newtonsoft.Json.Linq.JObject.Load(reader); return System.Text.Json.Nodes.JsonObject.Parse(jObject.ToString()); } public override void WriteJson(JsonWriter writer, System.Text.Json.Nodes.JsonObject value, Newtonsoft.Json.JsonSerializer serializer) { // 直接将JsonObject的字符串形式写入 writer.WriteRawValue(value.ToString()); } }
使用时在反序列化时指定转换器:
var jsonString = JsonConvert.SerializeObject(apiResponse); var expectedData = JsonConvert.DeserializeObject<System.Text.Json.Nodes.JsonObject>(jsonString, new JsonObjectConverter());
注意事项
- 接口返回的
JsonObject属于System.Text.Json生态,尽量保持整个流程用同一套库处理,减少不必要的跨库转换开销。 - 自定义转换器仅作为兼容旧代码的备选方案,优先选择方案1。
内容的提问来源于stack exchange,提问作者APotatoChip
相关产品推荐
相关产品推荐

