2014-04-05 3 views
2

API에 요청을 보내고 두 가지 응답이 있습니다.2 개의 JSON 응답에 대한 하나의 클래스

첫째 :

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

둘째 : 나는 두 경우에 대한 하나 개의 클래스가

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

만들 수 있습니까? 나는 C#과 Json.NET을 사용한다.

+1

두에 대해 하나 개의 클래스를 사용하고자하는 이유를 무엇 여기

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(); } } 

는 변환기를 사용하는 방법을 보여주는 데모입니다 다른 API 응답? –

+1

JSON이 유효하지 않습니다. 당신은''응답 ''을 의미 했습니까? { "count": 0, "items": [...]}'? –

+0

@AndrewWhitaker 당신 말이 맞아요. – eXit

답변

0

예, 당신은 JSON 형식을 감지하고 같은 클래스 (들)로 역 직렬화 JsonConverter 사용자 정의를 사용할 수 있습니다 이쪽을 봐주세요. 아래는 두 형식을 모두 처리 할 수있는 변환기입니다. 그것은 당신이 List<Item>으로 deserialize하려고한다고 가정합니다. 위의 출력 여기

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 
+0

나는 LINQ to JSON과 비슷한 접근법 (변환기없이)을 사용한다. – eXit

0

첫 번째로 알고 계시지 않는 경우이 온라인 도구 http://json2csharp.com/을 사용하여 JSON 문자열에서 C# 클래스를 생성 할 수 있습니다. 두 개의 다른 클래스를 사용하는 것이 더 나을 수 있다고 생각합니다. 하나만 사용해야하는 특별한 이유가 있습니까?

+0

'count'속성은 선택 사항입니다. 'items'속성은 첫 번째 응답과 비슷합니다. 하나의 객체를 만들 수 있다고 생각합니다. 그리고 나는 API로부터 어떤 응답이 반환되는지 알지 못합니다. – eXit

0

당신은 당신이 관심있는 속성을 선언하고 확장 데이터가 나머지를 할 수 있도록 JsonExtensionData 속성

를 사용할 수 있습니다. 이것은 또한 당신이/역 직렬화를 직렬화 할 때 자동으로 유지됩니다 때문에 추가 JSON을 추가하는 타사 소스에 대해 걱정할 필요가 없습니다 것을 의미처럼 왕복 JSON에 확장 데이터를 사용

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 
// } 

. Nifty.

확장 데이터를 직렬화 (또는 비 직렬화)하지 않으려면 은 ExtensionDataAttribute의 WriteData 및 ReadData 속성을 false로 설정하여 해당 기능을 사용하지 않도록 설정하십시오.

참조 : Json.NET 5.0 Release 7 – Immutable Collections

또는 사용자 정의 JsonConvert, 그래서 Deserialize JSON not working with JSON.NET

관련 문제