我向API发送请求并有两个回复。
首先:
{"response": [{...}, {...}]}
第二
{"response": {"count": 0, "items": [{...}, {...}]}}
我可以为两个案例创建一个类吗?我使用C#和Json.NET。
答案 0 :(得分:0)
首先,如果您不了解它,可以使用此在线工具http://json2csharp.com/,您可以从JSON字符串生成C#类。我认为使用两个不同的类可能会更好。是否有特定原因只使用一个?
答案 1 :(得分:0)
您可以使用JsonExtensionData
属性
只声明您感兴趣的属性,然后让扩展数据完成。
public class CustomerInvoice
{
// we're only modifing the tax rate
public decimal TaxRate { get; set; }
// everything else gets stored here
[JsonExtensionData]
private IDictionary<string, JToken> _additionalData;
}
string json = @"{
'HourlyRate': 150,
'Hours': 40,
'TaxRate': 0.125
}";
var invoice = JsonConvert.DeserializeObject<CustomerInvoice>(json);
// increase tax to 15%
invoice.TaxRate = 0.15m;
string result = JsonConvert.SerializeObject(invoice);
// {
// 'TaxRate': 0.15,
// 'HourlyRate': 150,
// 'Hours': 40
// }
使用扩展数据来往返JSON就像这样也意味着你没有 需要担心第三方来源添加额外的JSON,因为 序列化/反序列化时会自动保留它。 漂亮的。
如果您不希望序列化(或反序列化)扩展数据 通过设置WriteData和ReadData来禁用该功能 ExtensionDataAttribute上的属性为false。
参考:Json.NET 5.0 Release 7 – Immutable Collections
或自定义JsonConvert
,请查看此处Deserialize JSON not working with JSON.NET
答案 2 :(得分:0)
是的,您可以使用自定义JsonConverter
检测JSON格式并反序列化到同一个类中。下面是一个可以处理两种格式的转换器。它假定您要反序列化为List<Item>
。
class ItemListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<Item>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken response = JToken.Load(reader)["response"];
if (response.Type == JTokenType.Array)
{
return response.ToObject<List<Item>>();
}
else
{
return response["items"].ToObject<List<Item>>();
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
以下是演示如何使用转换器的演示:
class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
string json1 = @"
{
""response"" :
[
{ ""Id"" : 1, ""Name"" : ""Foo"" },
{ ""Id"" : 2, ""Name"" : ""Bar"" },
]
}";
DeserializeAndDump(json1);
string json2 = @"
{
""response"" :
{
""count"" : 2,
""items"" :
[
{ ""Id"" : 3, ""Name"" : ""Fizz"" },
{ ""Id"" : 4, ""Name"" : ""Buzz"" },
]
}
}";
DeserializeAndDump(json2);
}
private static void DeserializeAndDump(string json)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new ItemListConverter());
List<Item> list = JsonConvert.DeserializeObject<List<Item>>(json, settings);
foreach (Item item in list)
{
Console.WriteLine("Id: " + item.Id + ", Name: " + item.Name);
}
}
}
以上是上述的输出:
Id: 1, Name: Foo
Id: 2, Name: Bar
Id: 3, Name: Fizz
Id: 4, Name: Buzz