Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个类用于两个JSON响应_C#_.net_Json_Parsing_Json.net - Fatal编程技术网

C# 一个类用于两个JSON响应

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属性 只声明您感兴趣的属性,其余的由扩展数据完成

我向API发送请求,并有两个响应

第一:

{"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