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

.NET 6中使用System.Text.Json解析可变结构JSON遇报错求助

解决System.Text.Json解析可变结构JSON的问题

核心错误原因

你获取的fieldsetJsonString是JSON数组(根节点为[ ]),但你定义的Root类是一个包含fieldset列表的对象(期望根节点格式为{ "fieldset": [...] }),结构完全不匹配,因此反序列化失败。

针对可变结构的解决方案

根据你的需求(顶层键可选、内部键值对完全可变),以下几种方案都能解决问题:

方案1:直接反序列化为List<Dictionary<string, object>>

这是最直接的方式,完全适配可变键值对的结构:

var fieldsetData = JsonSerializer.Deserialize<List<Dictionary<string, object>>>(fieldsetJsonString);

每个数组元素会被转成Dictionary<string, object>,你可以通过键名(如order、combo)直接访问对应值,后续按需转换类型即可(比如将order转为int,combo转为List<Dictionary<string, object>>)。

方案2:使用JsonElement保留原始JSON类型信息

如果需要精准保留JSON的原始类型(比如区分整数、字符串、数组),同时兼顾性能,推荐用List<JsonElement>:

var fieldsetElements = JsonSerializer.Deserialize<List<JsonElement>>(fieldsetJsonString);

后续可通过JsonElement的内置方法(如GetInt32()、GetProperty()、EnumerateArray())访问内部数据,适合处理复杂或不确定的JSON结构。

方案3:混合强类型与动态类型(固定order字段时使用)

如果order是每个对象必有的固定字段,其他字段可变,可以利用[JsonExtensionData]特性定义混合类:

public class FieldsetItem
{
    [JsonPropertyName("order")]
    public int Order { get; set; }
    
    [JsonExtensionData]
    public Dictionary<string, JsonElement> ExtraFields { get; set; } = new();
}

反序列化代码:

var fieldsetItems = JsonSerializer.Deserialize<List<FieldsetItem>>(fieldsetJsonString);

[JsonExtensionData]会自动将所有未定义的字段存入ExtraFields字典,既保留了强类型的Order,又能兼容其他可变字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34