2017-11-06 6 views
0

, 응답 중 하나는 다음과 같이이다 :구문 분석 JSON 응답 내가</p> <p>그래서 통제 할 수없는 웹 API에서 개체 응답을 구문 분석하려고 해요

{ 
    "BatchID": 25, 
    "Results": [{ 
     "ItemID": 123, 
     "ResultMessage": "COMPLETED" 
    }, { 
     "ItemID": 456, 
     "ResultMessage": "COMPLETED" 
    }], 
    "COMPLETED_COUNT": 2, 
    "INPROGRESS_COUNT": 0, 
    "FAILED_COUNT": 0 
} 

이것은 NewtonSoft Json 라이브러리를 사용하여 매우 쉽게 파싱 할 수 있습니다. 그러나 나뿐만 아니라이 발생했다 :

{ 
    "3305": "COMPLETE", 
    "7305": "COMPLETE", 
    "COMPLETED_COUNT": 2, 
    "INPROGRESS_COUNT": 0, 
    "FAILED_COUNT": 0 
} 

내가 발생할 수있는 방법 int 속성 많은 생각이 없습니다. 이 예제에서는 "3305"와 "7305"두 개만 있습니다.

내 질문은 : 해당 응답의 모든 정수를 저장할 수있는 개체를 만들 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

+3

'Dictionary '로 비 직렬화해야합니다. 그렇지 않으면 알려진 구조로 하나 또는 두 개의 속성을 deserialize하고, 나머지 속성이이 속성에 따라 달라져야 하는지를 분류 한 다음, 알고있을 때 다시 deserialize해야합니다 직렬화 복원되는 형태 –

+0

또한 [알 수없는 속성뿐 아니라 알려진 속성을 모두 지원하지 않고도 지원하는 방법을 보여주는 [이 질문] (https://stackoverflow.com/questions/15253875/deserialize-json-with-known-and-unknown-fields)을 확인하십시오. "알 수없는"집합 –

+0

여기에있는 키의 숫자는 숫자이지만 문자열은 여전히 ​​문자열입니다. 그 문자열에 숫자가 포함되어 있다는 사실은 여러분이 알고있는 모든 추가 속성에 대해 사실 일지 모르지만 여전히 순수하게 문자열로 처리 할 것입니다. –

답변

0

값 & 이름을 가진 모든 속성을 보유 첫 번째 json의 "결과"하위 속성은이 개념에서 다루기 어려울 것이므로 속성의 하위 집합을 보는 "탐지"알고리즘을 만들기 위해 노력해야하며 일부 특정 키 속성이있는 경우 json을 비 직렬화하는 다른 유형의 올바른 유형을 선택하십시오.

예를 들어, 여기에 간단한 같은 추론이다 :

public static ResponseBase Classify(string json) 
{ 
    var response = JsonConvert.DeserializeObject<ResponseBase>(json); 

    if (response.ExtraData.ContainsKey("Results")) 
     return JsonConvert.DeserializeObject<ResponseWithResults>(json); 

    return response; 
} 

public class ResponseBase 
{ 
    [JsonProperty("COMPLETED_COUNT")] 
    public int CompletedCount { get; set; } 

    [JsonProperty("INPROGRESS_COUNT")] 
    public int InProgressCount { get; set; } 

    [JsonProperty("FAILED_COUNT")] 
    public int FailedCount { get; set; } 

    [JsonExtensionData] 
    public Dictionary<string, object> ExtraData { get; } = new Dictionary<string, object>(); 
} 

public class ResponseWithResults : ResponseBase 
{ 
    public int BatchId { get; set; } 
    public List<ResponseResult> Results { get; } = new List<ResponseResult>(); 
} 

public class ResponseResult 
{ 
    public int ItemId { get; set; } 
    public string ResultMessage { get; set; } 
} 

이 두 번 JSON 직렬화 복원하는 것이 노트를 수행합니다. 이를 처리/회피하는 여러 가지 방법이 있지만 이것이 유효한 방법인지 결정해야합니다.

+0

그게 내가 찾고 있던 것이 었습니다. – Pipo

1

API에서 얻은 JSON을 JObject으로 캐스팅 해보세요.

public class Response 
{ 
    [JsonProperty("COMPLETED_COUNT")] 
    public int CompletedCount { get; set; } 

    [JsonProperty("INPROGRESS_COUNT")] 
    public int InProgressCount { get; set; } 

    [JsonProperty("FAILED_COUNT")] 
    public int FailedCount { get; set; } 

    [JsonExtensionData] 
    public Dictionary<string, object> ExtraData { get; } = new Dictionary<string, object>(); 
} 

하십시오 : 그것은 알려진 구조 + 알 수없는 구조를 mimicks 형태로 주어진 JSON을 역 직렬화 Json.Net를 사용하고이 유형을 사용 유형을 정의하려면