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
相关产品推荐
相关产品推荐

