C# 一个类用于两个JSON响应
我向API发送请求,并有两个响应 第一:C# 一个类用于两个JSON响应,c#,.net,json,parsing,json.net,C#,.net,Json,Parsing,Json.net,我向API发送请求,并有两个响应 第一: {"response": [{...}, {...}]} 第二: {"response": {"count": 0, "items": [{...}, {...}]}} 我可以为两个案例创建一个类吗?我使用C#和Json.NET。首先,如果您不知道,有一个在线工具,您可以从Json字符串生成C#类。我认为最好使用两个不同的类。是否有只使用一个属性的特定原因?您可以使用JsonExtensionData属性 只声明您感兴趣的属性,其余的由扩展数据完成
{"response": [{...}, {...}]}
第二:
{"response": {"count": 0, "items": [{...}, {...}]}}
我可以为两个案例创建一个类吗?我使用C#和Json.NET。首先,如果您不知道,有一个在线工具,您可以从Json字符串生成C#类。我认为最好使用两个不同的类。是否有只使用一个属性的特定原因?您可以使用
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
// }
公共类CustomerVoice
{
//我们只是在修改税率
公共十进制税率{get;set;}
//其他的都存储在这里
[JsonExtensionData]
专用词典_附加数据;
}
字符串json=@”{
“HourlyRate”:150,
“小时”:40,
“税率”:0.125
}";
var invoice=JsonConvert.DeserializeObject(json);
//加税至15%
发票税率=0.15米;
字符串结果=JsonConvert.SerializeObject(发票);
// {
//“税率”:0.15,
//“HourlyRate”:150,
//小时数:40
// }
像这样使用扩展数据来往返JSON也意味着您不需要这样做
需要担心第三方源添加额外的JSON,因为
序列化/反序列化时,它将自动保留。
漂亮
如果不希望扩展数据序列化(或反序列化),则
通过设置WriteData和ReadData禁用该功能
ExtensionDataAttribute上的属性设置为false
参考:
或者自定义
JsonConvert
,请看这里是的,您可以使用自定义JsonConverter
检测JSON格式并反序列化到相同的类中。下面是一个可以处理这两种格式的转换器。它假设您将反序列化到列表中
您希望将一个类用于两个不同的API响应的原因是什么?您的JSON无效。您的意思是“response:{“count”:0,“items”:[…]}
?@AndrewWhitaker您是对的,thx.“count”属性是可选的。“items”属性类似于第一个响应。我想我可以创建一个对象。我不知道哪个响应是从API返回的,我对LINQ到JSON使用了类似的方法(没有转换器)。
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