You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:02:39