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

C#中含动态键名的JSON反序列化处理方案咨询

正确处理动态键JSON的反序列化方案

核心思路

你的JSON存在两个动态结构点:

  • 顶级键(IDENTITY/SELFIE)可变,但对应值的结构完全一致
  • imageReviewResults的键是动态数字字符串,但值的结构统一

直接用强类型字典就能完美解决,比Dictionary<string, object>更安全,无需后续手动类型转换。

修正后的实体类定义

先补全IdentityData的所有字段,尤其是把imageReviewResults定义为字典类型,同时完善对应的子结构类:

// 对应reviewResult和imageReviewResults里的子结构
public class ReviewResultData
{
    [JsonPropertyName("reviewAnswer")]
    [DataMember(Name = "reviewAnswer")]
    public string ReviewAnswer { get; set; }
}

// 对应顶级动态键的值结构
public class IdentityData
{
    [JsonPropertyName("reviewResult")]
    [DataMember(Name = "reviewResult")]
    public ReviewResultData ReviewResult { get; set; }

    [JsonPropertyName("country")]
    [DataMember(Name = "country")]
    public string Country { get; set; }

    [JsonPropertyName("idDocType")]
    [DataMember(Name = "idDocType")]
    public string DocType { get; set; }

    [JsonPropertyName("imageIds")]
    [DataMember(Name = "imageIds")]
    public int[] ImageIds { get; set; }

    [JsonPropertyName("imageReviewResults")]
    [DataMember(Name = "imageReviewResults")]
    public Dictionary<string, ReviewResultData> ImageReviewResults { get; set; }

    [JsonPropertyName("forbidden")]
    [DataMember(Name = "forbidden")]
    public bool Forbidden { get; set; }

    [JsonPropertyName("doubleSided")]
    [DataMember(Name = "doubleSided")]
    public bool DoubleSided { get; set; }

    [JsonPropertyName("stepStatuses")]
    [DataMember(Name = "stepStatuses")]
    public object StepStatuses { get; set; }
}

反序列化代码

用System.Text.Json(.NET Core/.NET 5+)

直接将JSON字符串反序列化为Dictionary<string, IdentityData>:

string json = "{\"IDENTITY\": {...}}"; // 你的目标JSON字符串
var result = JsonSerializer.Deserialize<Dictionary<string, IdentityData>>(json);

// 访问数据示例
foreach (var kvp in result)
{
    string dataType = kvp.Key; // 拿到IDENTITY或SELFIE
    IdentityData detail = kvp.Value;
    Console.WriteLine($"数据类型:{dataType},所属国家:{detail.Country}");
    foreach (var imageReview in detail.ImageReviewResults)
    {
        Console.WriteLine($"图片ID {imageReview.Key} 审核结果:{imageReview.Value.ReviewAnswer}");
    }
}

用Newtonsoft.Json(Json.NET)

如果使用Newtonsoft库,反序列化逻辑类似,注意属性标签替换为JsonProperty即可:

var result = JsonConvert.DeserializeObject<Dictionary<string, IdentityData>>(json);

关于Dictionary<string, object>的疑问

可以用,但不推荐:

  • 用Dictionary<string, object>反序列化后,需要手动将每个值转换为IdentityData类型,容易出现类型转换错误
  • 强类型字典Dictionary<string, IdentityData>直接完成类型映射,编译期就能发现错误,代码更易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:15:36