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

C#中GraphQLHttpClient处理嵌套JSON字符串自动反序列化问题

完全可以自动处理,你可以通过自定义Newtonsoft.Json的JsonConverter实现嵌套JSON字符串的自动反序列化,不需要手动二次处理,步骤如下:


步骤1:实现通用嵌套JSON反序列化Converter

using Newtonsoft.Json;
using System;

public class NestedJsonStringConverter<T> : JsonConverter<T>
{
    public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 读取字段原始值,若为字符串格式则当作JSON二次反序列化
        var jsonString = reader.Value as string;
        return string.IsNullOrEmpty(jsonString) ? default : JsonConvert.DeserializeObject<T>(jsonString);
    }

    public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer)
    {
        // 若序列化时需要把对象转回嵌套JSON字符串,启用下面一行代码即可
        // writer.WriteValue(JsonConvert.SerializeObject(value));
        // 默认直接序列化对象,按需调整逻辑
        serializer.Serialize(writer, value);
    }
}

步骤2:给目标属性添加Converter特性

直接使用你期望的MetaData类定义,仅需要给metaData属性加一行特性标注即可正常反序列化:

public class Container
{
    public string id { get; set; }
    public string containerId { get; set; }
    // 标注使用自定义Converter自动处理嵌套JSON字符串
    [JsonConverter(typeof(NestedJsonStringConverter<MetaData>))]
    public MetaData metaData { get; set; }
    public Wastefraction wasteFraction { get; set; }
}

public class MetaData
{
    public string postnummer { get; set; }
    public string husnr { get; set; }
    public string postdistrikt { get; set; }
    public string ejendomsnr { get; set; }
    public string kundenr { get; set; }
    public string address { get; set; }
    public string vej { get; set; }
    public string nr { get; set; }
}

可选:全局注册Converter(适配大量同类型字段场景)

如果你存在多个同格式的嵌套JSON字符串字段,可以将Converter直接注册到GraphQLHttpClient的序列化配置中,不需要逐个属性加特性:

// 初始化GraphQLHttpClient时配置序列化器
var serializer = new NewtonsoftJsonSerializer(
    new JsonSerializerSettings
    {
        Converters = { 
            new NestedJsonStringConverter<MetaData>(),
            // 有其他嵌套类型可以依次添加
        }
    });

var graphQlClient = new GraphQLHttpClient("你的GraphQL端点地址", serializer);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:57:02