2014-11-21 1 views
1

통화 속도가 포함 된 여러 HTTP API의 결과가 있습니다. 결과는 매우 유사하지만 유감스럽게도 정확히 일치하지는 않습니다.JSON 객체를 다른 형식으로 일반 클래스로 직렬화 해제

모든 개체에 대해 고정 된 일반 형식으로 개체에 deserialize하고 싶습니다. 수동 문자열 변경보다 더 나은 방법이 있다고 생각합니다.

아이디어가 있으십니까?

편집 :

이의 말을하자 :

-in 결과 API1에서 내가 얻을 : 내가 얻을 API2에서

field_1, field_2, field_3 

-in 결과 :

field_1, field_2, field_007, 

을 - ~에서 결과 :,619,내가 얻을 :

field_111, field_2, field_3, 

그리고 클래스가 나는 결과를 역 직렬화하고자 할은 다음과 같습니다

class DeserializedJson 
{ 
    public string field_1 { get; set; } 
    public string field_2 { get; set; } 
    public string field_3 { get; set; } 
} 

무엇이 예에서는 중요 : field_3 객체 DeserializedJson에서이 field_3으로 만 표시 될 수 있습니다 또는 field_007. 이 두 가지 옵션.

그래서 조건부 비 직렬화 속성이 있는지 또는 이와 비슷한 것이 있는지 궁금합니다.

+0

클래스에있는 필드 ? –

+0

@BrianRogers 내 업데이트를 확인하십시오. field_xxx는 엄격히 지정된 형식으로 나타날 수 있습니다. – Saint

+0

어떤 시리얼 라이저를 사용하고 있습니까? – Grx70

답변

0

이와 비슷한 제품을 찾고 계십니까?

(YourClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(YourClass)); 

내가 잘못 이해하지 않는 한. "공통"유형을 원할 경우 상속을 사용하십시오.

+0

나는 그것이 작동하지 않을 것이라고 생각한다. 내 질문에 대한 답변을보십시오 – Saint

+0

어쩌면이 라인을 따라 뭔가? 'public static dynamic Convert (동적 소스, 유형 dest) { return Convert.ChangeType (source, dest); }' – RyanCosans

1

참고 :이 답변은 당신이 Json.Net을 사용하게 될 가정 작성되었습니다. 내가 게시 한 후, 당신이 당신의 질문에 당신이 어떤 시리얼 라이저를 사용했는지 (또는 사용하고 싶었다) 언급하지 않았다는 것을 깨달았다. 난 당신이 여전히 다른 serializers와 함께 여기에 제시된 것과 동일한 기술을 사용할 수 있다고 생각하지만, 조정을해야 할 수도 있습니다. YMMV.

음, 한 당신의 매핑이 중복되지 않는 한, 다음 하나의 간단한 해결책은 Json.Net 올바른 공공 속성을 설정 할 사용하는 클래스에 개인 setter를하는 것입니다. Json.Net은 JSON에없는 클래스 멤버를 무시할 것이므로이 방법이 효과적입니다.다음은 수정 된 클래스는 당신이 접근했다 경우처럼 보일 것 인 것이다 :

class DeserializedJson 
{ 
    public string field_1 { get; set; } 
    public string field_2 { get; set; } 
    public string field_3 { get; set; } 
    [JsonProperty] 
    private string field_007 
    { 
     set { field_3 = value; } 
    } 
    [JsonProperty] 
    private string field_111 
    { 
     set { field_1 = value; } 
    } 
} 

을 그리고 여기에이 작품을 증명하는 데모입니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     DeserializeAndDump(1, @"{""field_1"":""a"",""field_2"":""b"",""field_3"":""c""}"); 
     DeserializeAndDump(2, @"{""field_1"":""d"",""field_2"":""e"",""field_007"":""f""}"); 
     DeserializeAndDump(3, @"{""field_111"":""g"",""field_2"":""h"",""field_3"":""i""}"); 
    } 

    private static void DeserializeAndDump(int n, string json) 
    { 
     Console.WriteLine("--- API " + n + " ---"); 
     DeserializedJson obj = JsonConvert.DeserializeObject<DeserializedJson>(json); 
     Console.WriteLine("field_1: " + obj.field_1); 
     Console.WriteLine("field_2: " + obj.field_2); 
     Console.WriteLine("field_3: " + obj.field_3); 
     Console.WriteLine(); 
    } 
} 

출력 :의

--- API 1 --- 
field_1: a 
field_2: b 
field_3: c 

--- API 2 --- 
field_1: d 
field_2: e 
field_3: f 

--- API 3 --- 
field_1: g 
field_2: h 
field_3: i 

물론 JSON의 field_007이 가끔 field_3으로 매핑되고 때로는 클래스의 field_2에 매핑되는 경우이 접근 방식이 작동하지 않습니다. 이 경우 각기 다른 API 메소드에 대해 별도의 DeserializedJson 클래스를 만들어야합니다. 이들 모두를 같은 기본 클래스에서 상속 받도록 만들 수 있으며 각 하위 클래스에서 위의 기술을 사용하여 기본 클래스의 올바른 속성을 설정할 수 있습니다. 다음은 그의 모습 내용은 다음과 같습니다

class DeserializedJson 
{ 
    public string field_1 { get; set; } 
    public string field_2 { get; set; } 
    public string field_3 { get; set; } 
} 

class DeserializedJsonAPI1 : DeserializedJson 
{ 
    [JsonProperty] 
    private string field_007 
    { 
     set { field_2 = value; } 
    } 
} 

class DeserializedJsonAPI2 : DeserializedJson 
{ 
    [JsonProperty] 
    private string field_007 
    { 
     set { field_3 = value; } 
    } 
} 

데모 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     DeserializeAndDump<DeserializedJsonAPI1>(1, @"{""field_1"":""q"",""field_007"":""r"",""field_3"":""s""}"); 
     DeserializeAndDump<DeserializedJsonAPI2>(2, @"{""field_1"":""x"",""field_2"":""y"",""field_007"":""z""}"); 
    } 

    private static void DeserializeAndDump<T>(int n, string json) where T : DeserializedJson 
    { 
     Console.WriteLine("--- API " + n + " ---"); 
     DeserializedJson obj = JsonConvert.DeserializeObject<T>(json); 
     Console.WriteLine("field_1: " + obj.field_1); 
     Console.WriteLine("field_2: " + obj.field_2); 
     Console.WriteLine("field_3: " + obj.field_3); 
     Console.WriteLine(); 
    } 
} 

출력 : JSON은지도에서 당신이하는 "field_xxx"값을 결정하려면 어떻게

--- API 1 --- 
field_1: q 
field_2: r 
field_3: s 

--- API 2 --- 
field_1: x 
field_2: y 
field_3: z 
관련 문제