一个类用于两个JSON响应

时间:2014-04-05 16:03:34

标签: c# .net json parsing json.net

我向API发送请求并有两个回复。

首先:

{"response": [{...}, {...}]}

第二

{"response": {"count": 0, "items": [{...}, {...}]}}

我可以为两个案例创建一个类吗?我使用C#和Json.NET。

3 个答案:

答案 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