2012-06-26 2 views
13

페이스 북과 트위터 모두에서 정보를 보유하는 단일 데이터 클래스를 만들려고합니다.여러 JsonProperties를 할당 하시겠습니까?

하지만 twitter에서 내 JSON 답장에 id_str이 필요하고 FaceBook에서 id이 필요합니다.

id -string에 넣으려면이 두 개가 필요합니다.

이제 id_strid -string으로 역 직렬화하려는 경우 [JsonProperty("id_str")]을 사용할 수 있음을 알고 있습니다.

하지만 Facebook의 id과 Twitters id_str을 동일한 데이터 형식으로 동일한 id 문자열로 역 직렬화해야하는 경우 어떻게해야합니까?

답변

7

아니요, 불가능합니다.

Json.NET documentation을 살펴 보겠습니다. 특히 JsonPropertyAttribute 클래스에 대한 도움말 페이지.

는 인용 :

는 "항상 지정된 이름을 가진 멤버를 직렬화 할 JsonSerializer 지시합니다."

Newtonsoft.Json 네임 스페이스에 선언되었습니다. 우리는 그것이 어떻게 선언되었는지 결정할 필요가 있습니다. 이제 코드 플렉스에 Json.NET의 소스 코드를 살펴 보자 : 질문에 대한 답

http://json.codeplex.com/

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |  
AttributeTargets.Parameter, AllowMultiple = false)] 
public sealed class JsonPropertyAttribute : Attribute 
{ 
    //... 
} 

추측을. 특성의 AllowMultiple 속성은 false로 설정됩니다. 따라서이 속성을 사용하여 속성, 필드 또는 매개 변수를 두 번 이상 꾸밀 수 없습니다.

Json.net이 어떤 속성을 사용할 것인지를 어떻게 예상 할 수 있다고해도? 받은 JSON 데이터를 비 직렬화 할 수있는 Twitter 및 Facebook 유형을 별도로 만들었습니다.

그래서 :

Twitter -> JSON -> Twitter specific types 
Facebook -> JSON -> Facebook spefic types 

그런 다음 응용 프로그램 대신 직접 이러한 유형의 주소의 사용 추상화를 만들 수 있습니다. 그들은 단지 특정 소셜 미디어 구현에 속합니다.

트위터/페이스 북/... speficic 유형 -> 귀하의 유형

당신이 직접 "일반적인 유형"으로 데이터를 역 직렬화 할 경우에, 당신은 단지 그들이 일치하지 않기 때문에 어려움을 겪고 유지하려고 100 % 수신 된 데이터로 인해 넌리 펑키하고 탈 직렬화 로직을 유지하기가 어렵습니다.

또 다른 옵션은 사용자 지정 Json.NET 변환기를 만드는 것입니다.

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

그냥 트위터와 페이스 북에 대한 변환기를 작성하고 JSON 데이터를 역 직렬화 할 때, 당신이 사용하고자하는 변환기를 지정합니다.

  • TwitterConverter
  • FacebookConverter

예컨대 :

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter()); 

어쨌든 나는 직렬화 논리 자체 클래스 유형을 오염 피하려고한다. 내가 할 수있는 가장 쉬운 방법으로 그것을 해결할 생각

+0

잘 사용 어떤 모델 클래스 잊고, 그냥 사용할 수 있습니다, 나는 그것을 기대했다 둘 중 하나만 확인하고 null이 아닌 것을 사용합니다. 어쨌든 나는 다른 것을 생각해 낼 필요가있다. 어쨌든 고마워! :) –

+0

나는 마지막 옵션이 오히려 잘 작동한다고 생각한다. – JefClaes

9

.....

public string id_str { 
     get{return id;} 
     set{id = id_str;} 
    } 

    public string id { get; set; } 

은 간단하게 모두를 추가하고, 하나를 만들어 다른 설정 .. 그것은 작동 : P 때로는 간단한 솔루션은 최고 ?

+2

작동하지만 종류에 따라 모든 종류의 속성이있는 형식이 오염됩니다. 절반은 여러분이 비 직렬화 한 JSON에 따라 사용되지 않습니다. –

+0

정말로,하지만 적어도 적절한 방법을 수행하기 전에 내 이론을 테스트 할 수 있습니다 :) –

+0

빙고 !!!!! 몇 가지 간단한 경우에 이것이 최선의 해결책이다. –

1

소비 할 일반 클래스 모델을 찾고있는 경우 다음과 같이 수행 할 수 있습니다.

public class GenericClass 
{ 
    public virtual string ID {get;set;} 
} 
public class FaceBook : GenericClass 
{ 
    [JsonProperty("id")] 
    public override string ID { get => base.ID; set => base.ID = value; } 
} 
public class Twitter : GenericClass 
{ 
    [JsonProperty("id_str")] 
    public override string ID { get => base.ID; set => base.ID = value; } 
} 
페이스 북의 경우

,

GenericClass genericClass = JsonConvert.DeserializeObject<FaceBook>(json); 

FOT 트위터,

GenericClass genericClass = JsonConvert.DeserializeObject<Twitter>(json); 

하고 GenericClass

관련 문제