2012-12-01 4 views
1

У меня возникла проблема с Json.Net.Только сериализовать некоторые специфические свойства класса?

Мое приложение подключено к базе данных и хранит в нем некоторые данные. Давайте предположим, что мое приложение имеет три различных класса: Entity, группа, организация

Короткий взгляд в класс 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.
При сериализации сущности я не хочу полностью сериализовать EntityGroup и EntityOrganisation, но только их идентификаторы.

Некоторые быстрый пример того, как я хотел бы, чтобы это выглядело как:

(Как это выглядит сейчас)

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

(Как это должно выглядеть)

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

Можно для настройки JsonParser, который только сериализует свойство ID Group и Organization при сериализации Entity?

+0

Что вы хотите иметь с Организацией и Группой, когда вы deserialize? – tallseth

+0

Я не буду десериализовать его напрямую. Я проанализирую его и загружу соответствующую организацию/группу из базы данных. Возможно, я сделаю это по-другому, но это моя текущая идея :) – TorbenJ

+0

Или, может быть, я могу использовать решение nick_w, чтобы просто загрузить Организацию/Группу при десериализации. – TorbenJ

ответ

2

Что об этом:

В вашем Entity классе, добавьте атрибут JsonConverter к EntityGroup класса:

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

Это будет использовать EntityGroupConverter сериализовать Group. Этот класс выглядит следующим образом:

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'. –

Смежные вопросы