我有一个第三方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; }
答案 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
属性也具有相同的作用。
我创建了一个助手只读属性,该属性返回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();
}
}
}