2012-12-01 2 views
1

Json.Net에서 문제가 발생했습니다.클래스의 특정 속성 만 serialize 할 수 있습니까?

내 응용 프로그램이 데이터베이스에 연결되어 일부 데이터가 저장됩니다. 내 응용 프로그램을 가정 할 수 있습니다 세 가지 종류가 있습니다 엔티티, 그룹, 조직

Entity 클래스에

짧은 모양 :

public class Entity 
{ 
    [JsonIgnore] 
    public int ID { get; private set; } 
    [JsonProperty] 
    public string UID { get; private set; } 
    [JsonProperty] 
    public Gender EntityGender { get; set; } 
    [JsonProperty] 
    public string Surname { get; set; } 
    [JsonProperty] 
    public string Forename { get; set; } 
    [JsonProperty] 
    public Group EntityGroup { get; set; } 
    [JsonProperty] 
    public Organisation EntityOrganisation { get; set; } 

조직 및 그룹은 또한 ID 속성이 있습니다.
엔티티를 직렬화 할 때 엔티티 그룹과 엔티티 조직을 완전히 일련 화하지 않고 ID 만 직렬화하고 싶습니다.

나는 그것을 같이하고 싶은 방법 빠른 예 : (이 같아야 방법)이 가능

{ 
    "UID": "6c5204356b3a1a33", 
    "Surname": "Bar", 
    "Forename": "Foo", 
    "EntityGroup": { 
    "ID": 1, 
    "GroupOrganisation": { 
     "ID": 1 
    } 
    }, 
    "EntityOrganisation": null, 
    "EntityStation": null 
} 

가 (지금 보이는 방법)

{ 
    "UID": "6c5204356b3a1a33", 
    "Surname": "Bar", 
    "Forename": "Foo", 
    "EntityGroup": { 
    "Name": "XGroup", 
    "GroupOrganisation": { 
     "Name": "FooOrg" 
    } 
    }, 
    "EntityOrganisation": null, 
    "EntityStation": null 
} 

을 엔터티를 직렬화 할 때 그룹 및 조직의 ID 속성을 serialize하는 JsonParser를 설정하려면 어떻게해야합니까? 이것에 대해

+0

역 직렬화시 조직 및 그룹에 대해 수행하고 싶은 작업은 무엇입니까? – tallseth

+0

나는 이것을 직접적으로 직렬화하지 않을 것이다. 그것을 파싱하고 해당 조직/그룹을 데이터베이스에서로드합니다. 어쩌면 내가 다른 방법으로 그것을 할거야하지만 그것은 내 현재의 생각이다 :) – TorbenJ

+0

아니면 간단하게 조직/그룹 deserializing 때 nick_w의 솔루션을 사용할 수 있습니다. – TorbenJ

답변

2

무엇 : 당신의 Entity 클래스에서

EntityGroup 클래스에 JsonConverter 속성을 추가 :

[JsonProperty] 
[JsonConverter(typeof(EntityGroupConverter))] 
public Group EntityGroup { get; set; } 

이것은 Group를 직렬화 할 EntityGroupConverter을 사용합니다. 다음과 같이이 클래스는 다음과 같습니다

class EntityGroupConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Group); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, 
     JsonSerializer serializer) 
    { 
     Group group = value as Group; 
     serializer.Serialize(writer, new { ID = group.ID, 
      GroupOrganisation = new { ID = group.Organisation.ID } }); 
    } 
} 

여기에만 원하는 속성을 포함하는 익명의 객체를 작성하는 serializer을 사용하는 키입니다.

참고 ReadJson은 구현되지 않은 채로 남아 있습니다.이 단계에서는 직렬화가 필요하지 않다고 가정합니다.

편집

Skadier가 지적한 것처럼, ReadJson의 서명이 Json.NET의 최신 버전에 다음과 같이 표시됩니다 (이 질문에 사용되는 버전은 3.5.0.0입니다) :

public override object ReadJson(JsonReader reader, Type objectType, 
     object existingValue, JsonSerializer serializer) 
+0

고마워요! :) 매개 변수가 올바르지 않아서 ReadJson() 메서드를 수정해야했습니다. – TorbenJ

+1

@Skadier 당신을 위해 일해 준 것을 기쁘게 생각합니다! 나는'ReadJson' 매개 변수에 대한 당신의 요지를 언급하기 위해 나의 대답을 편집했다. –

관련 문제