将不可预测的JSON属性反序列化为字符串

时间:2019-03-27 17:05:35

标签: c# json.net

我有一个第三方API响应,该响应具有一个非常不可预测的属性,其余都可以。

有时该属性是一个完全嵌套的对象,有时是一个空字符串,有时是一个数组...文档不是很好。

以下是一些示例回复,但可能会有更多变化:

"errors": {
    "invalid_player_ids" : ["5fdc92b2-3b2a-11e5-ac13-8fdccfe4d986", "00cb73f8-5815-11e5-ba69-f75522da5528"]
  }

"errors": ["Notification content must not be null for any languages."]

"errors": ""

幸运的是,此属性不是太重要,但是对于日志记录目的来说却是一个不错的选择。

是否可以照常反序列化模型,但是对于此特定属性errors,可以将整个对象反序列化为字符串属性?这样吗

public string Errors { get; set; }

2 个答案:

答案 0 :(得分:3)

我将使用JToken来处理不可预测的属性。它可以处理任何JSON,并且如果您需要注销,则只需使用ToString()即可。

public class Response
{
    public JToken Errors { get; set; }
}

然后:

Response resp = JsonConvert.DeserializeObject<Response>(json);
Console.WriteLine("Errors: " + resp.Errors.ToString());

这是一个有效的演示:https://dotnetfiddle.net/5jXHjV

答案 1 :(得分:1)

就像@stuartd所述,dynamic属性也具有相同的作用。

dotNetFiddle:https://dotnetfiddle.net/dVzsZm

这是工作代码。

我创建了一个助手只读属性,该属性返回ToString属性中的dynamic。您也可以不用它。

using System;
using Newtonsoft.Json;

namespace DynamicErrorsJson
{
    public class ApiResponse
    {
        public dynamic Errors { get; set; }

        public string ErrorsString
        {
            get
            {
                string value = string.Empty;
                if (Errors != null)
                {
                    value = Errors.ToString();
                }

                return value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var listErrorsJson = @"{ ""errors"": {""invalid_player_ids"" : [""5fdc92b2-3b2a-11e5-ac13-8fdccfe4d986"", ""00cb73f8-5815-11e5-ba69-f75522da5528""] } }";
            var stringErrorsJson = @"{ ""errors"": [""Notification content must not be null for any languages.""] }";
            var noErrorsJson = @"{""errors"": """" }";

            var listErrorsResponse = JsonConvert.DeserializeObject<ApiResponse>(listErrorsJson);
            var stringErrorsJsonResponse = JsonConvert.DeserializeObject<ApiResponse>(stringErrorsJson);
            var noErrorsJsonResponse = JsonConvert.DeserializeObject<ApiResponse>(noErrorsJson);

            Console.WriteLine("listErrorsJson Response: {0}\n\t", listErrorsResponse.ErrorsString);
            Console.WriteLine("stringErrorsJson Response: {0}\n\t", stringErrorsJsonResponse.ErrorsString);
            Console.WriteLine("noErrorsJson Response: {0}\n\t", noErrorsJsonResponse.ErrorsString);
            Console.WriteLine();
            Console.WriteLine("Press a key to exit...");

            Console.ReadKey();
        }
    }
}

这是输出

enter image description here