我正在与一个 API 通信,该 API 返回包含 true、false 或字符串数组的 JSON。我希望反序列化此 JSON 并将 bool 值(如果有的话)存储在数据类型为 bool 的名为 Success 的类字段中,如果有数组,则存储在名为 Result 的自定义数据类型的字段中。
实现这一目标的最佳方式是什么?
一些 JSON:
[
{"status":"ok","result":true},
{
"status":"ok",
"result":
[
{"name":"John Doe","UserIdentifier":"abc","MaxAccounts":"2"}
]
}
]
我的结果类:
class Result
{
string Name,
string UserIdentifier,
string MaxAccounts
}
与 API 通信的类:
class Api
{
public string Status { get; set; }
public Result[] Result { get; set; }
public bool Success { get; set; }
}
最佳答案
使用 JSON.NET,您可以编写自定义 JSON 转换器。例如,您可以拥有以下对象:
public class Root
{
public string Status { get; set; }
public Result Result { get; set; }
}
public class Result
{
public bool? Value { get; set; }
public Item[] Items { get; set; }
}
public class Item
{
public string Name { get; set; }
public string UserIdentifier { get; set; }
public string MaxAccounts { get; set; }
}
并且您的 JSON 将被反序列化为 Root[]
。
自定义 JSON 转换器可能如下所示:
public class ResultConverter: JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Result);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Boolean)
{
return new Result
{
Value = (bool)reader.Value,
};
}
return new Result
{
Items = serializer.Deserialize<Item[]>(reader),
};
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// If you want to support serializing you could implement this method as well
throw new NotImplementedException();
}
}
然后:
class Program
{
static void Main()
{
var json =
@"[
{
""status"": ""ok"",
""result"": true
},
{
""status"": ""ok"",
""result"": [
{
""name"": ""John Doe"",
""UserIdentifier"": ""abc"",
""MaxAccounts"": ""2""
}
]
}
]";
var settings = new JsonSerializerSettings();
settings.Converters.Add(new ResultConverter());
Root[] root = JsonConvert.DeserializeObject<Root[]>(json, settings);
// do something with the results here
}
}
关于C#:当一个字段可以是不同类型时反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17922848/