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

使用Newtonsoft.Json反序列化含JsonArray字段对象时遇构造函数错误

解决Newtonsoft.Json反序列化System.Text.Json.JsonArray字段的错误

错误的核心原因是Newtonsoft.Json(Json.NET)和System.Text.Json是两套完全独立的JSON处理库,System.Text.Json.Nodes.JsonArray是后者专属的类型。Json.NET无法自动识别并创建这个类型的实例——因为JsonArray没有公共无参构造函数,Json.NET也没有内置对它的支持逻辑。

以下是三种可行的解决方案:

方案1:改用System.Text.Json完成反序列化

既然字段使用了System.Text.Json的JsonArray,直接用该库的序列化API更匹配,代码修改如下:

using System.Text.Json;
using System.Text.Json.Nodes;

var input = "{ \"data\": [{ \"test\": \"123\" }] }";

// 配置驼峰命名匹配
var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};

var deserialized = JsonSerializer.Deserialize<Input>(input, options);

public class Input
{
    public JsonArray Data { get; set; }
}

方案2:替换为Newtonsoft.Json的JArray类型

如果坚持使用Newtonsoft.Json,把字段类型换成Json.NET自带的JArray,它和Json.NET的序列化逻辑完全兼容:

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq; // 引入JArray所在命名空间

var input = "{ \"data\": [{ \"test\": \"123\" }] }";

var deserialized = JsonConvert.DeserializeObject<Input>(input, new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new CamelCaseNamingStrategy()
    }
});

public class Input
{
    public JArray Data { get; set; } // 替换为JArray
}

方案3:为JsonArray编写Newtonsoft.Json自定义转换器

如果必须同时保留Newtonsoft.Json和JsonArray类型,可以自定义一个转换器实现两者兼容:

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Text.Json.Nodes;

var input = "{ \"data\": [{ \"test\": \"123\" }] }";

var deserialized = JsonConvert.DeserializeObject<Input>(input, new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new CamelCaseNamingStrategy()
    },
    Converters = { new JsonArrayConverter() } // 添加自定义转换器
});

public class Input
{
    public JsonArray Data { get; set; }
}

// 自定义转换器
public class JsonArrayConverter : JsonConverter<JsonArray>
{
    public override JsonArray ReadJson(JsonReader reader, Type objectType, JsonArray existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 先把Json.NET的JToken转换为JSON字符串,再用System.Text.Json解析为JsonArray
        var jArray = JArray.Load(reader);
        return JsonArray.Parse(jArray.ToString());
    }

    public override void WriteJson(JsonWriter writer, JsonArray value, JsonSerializer serializer)
    {
        // 反向转换:JsonArray转字符串再转JToken写入
        var jArray = JArray.Parse(value.ToString());
        serializer.Serialize(writer, jArray);
    }
}

内容的提问来源于stack exchange,提问作者KwarcPL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:50:19