为了账号安全,请及时绑定邮箱和手机立即绑定

使用不同的模式反序列化 JSON

使用不同的模式反序列化 JSON

C#
翻翻过去那场雪 2021-11-21 11:04:27
我将 JSON.Net 与 .NET 4.7 一起使用。在我调用的 API 中,对于同一个调用,我似乎可以随机获得两种错误 json :(。错误类型 1:{   "Code": 0,   "Msg": ["Some Warning"]}错误类型 2:{    "Code": 0,    "Msg": [          {"Error": 5 },          {"Error": 6 }    ]}正如你所看到的,它Msg改变了它的结构。我想要一个通用的 POCO 来反序列化,但是什么时候Msg改变呢?JsonConvert.DeserializeObject<MyCommonPoco>(theJson);
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

您可以编写JsonConverter处理不同类型的自定义。例如,您可以使用以下 JSON:


{

    "Code": 0,

    "Msg": [

        "A single string",

        { "Message": "An object with a message" },

        { "Message": "An object with a message and a code", "Code": 5 },

        { "Code": 5 }

    ]

}

在此示例中,Msg数组可以包含原始字符串或复杂对象。该对象可以包含 a Message、 aCode或两者。


您将为此选择最常见的数据结构,一种能够表示所有信息的数据结构。例如,这意味着您必须将该原始字符串包装到兼容对象中。


public class Error

{

    public int Code { get; set; }

    public ErrorMessage[] Msg { get; set; }

}


public class ErrorMessage

{

    public string Message { get; set; }

    public int? Code { get; set; }

}

然后您可以使用自定义


然后,使用 custom JsonConverter,您可以解析上面的 JSON:


public class ErrorMessageConverter : JsonConverter

{

    public override bool CanConvert(Type objectType)

        => objectType == typeof(ErrorMessage);


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)

    {

        // handle the primitive string

        if (reader.TokenType == JsonToken.String)

            return new ErrorMessage { Message = (string)reader.Value };


        // handle a complex object; just assume that it is an `ErrorMessage` here

        else if (reader.TokenType == JsonToken.StartObject)

            return JObject.Load(reader).ToObject<ErrorMessage>();


        throw new NotSupportedException();

    }


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

    {

        throw new NotImplementedException();

    }

}

这将是使用该转换器的一种方法:


// the single quotes are just here to make it more readable; JSON.NET support this

// although it isn’t valid JSON

var json = @"{

    'Code': 0,

    'Msg': [

        'A single string',

        { 'Message': 'An object with a message' },

        { 'Message': 'An object with a message and a code', 'Code': 5 },

        { 'Code': 5 }

    ]

}";


var settings = new JsonSerializerSettings()

settings.Converters.Add(new ErrorMessageConverter());


var result = JsonConvert.DeserializeObject<Error>(json, settings);

//img1.sycdn.imooc.com//6199b75d0001559003560205.jpg

查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信