Пользовательское сопоставление с Json.NET

Я пытаюсь сопоставить JSON, который выглядит как

"ids": {
    "id": {
        "@value":"6763754764235874140"
    }
}

И я хотел бы сопоставить его с парой классов, которые выглядят как

class Property
{
    public Ids Ids { get; set; }
}

class Ids
{
    public string Id { get; set; }
}

Итак, в основном я хочу вставить значение ids/id/@value из документа JSON в Ids.Id в архитектуре класса. Просматривая документацию, я подумал, что могу использовать что-то вроде

[JsonProperty(ItemConverterType=typeof(IdConverter))]
public string Id { get; set; }

и предоставить собственный подкласс JsonConverter с именем IdConverter. Однако, когда я это делаю, мой IdConverter.ReadJson никогда не вызывается. Что я делаю не так?


person Dathan    schedule 07.08.2012    source источник
comment
имя вашей собственности Id, но id в json. Это может быть case проблема   -  person L.B    schedule 07.08.2012
comment
Оказывается, Json.NET достаточно умен, чтобы десериализовать ids в свойство Ids, хотя он будет учитывать регистр при сериализации, если вы не скажете ему этого не делать.   -  person Dathan    schedule 07.08.2012


Ответы (1)


Похоже, ответ заключался в том, что ItemConverterType предназначен для преобразования элементов в массив. Двойная аннотация свойства с атрибутами JsonProperty и JsonConverter работает:

[JsonProperty(PropertyName="id")]
[JsonConverter(typeof(IdConverter))]
public string Id { get; set; }
person Dathan    schedule 07.08.2012
comment
Поздний здесь. Но у меня была та же проблема с использованием JsonProperty. Я изменил его на JsonConverter, и он работает без дополнительного атрибута JsonProperty. Возможно, это была ошибка в более старой версии, но в современных версиях (в частности, v4) вы можете просто использовать JsonConverter - person dan richardson; 10.07.2014
comment
Прошло довольно много времени с тех пор, как я возился с этим, но я считаю, что атрибут JsonProperty был необходим для сериализации Id (первая буква в верхнем регистре) в поле JSON с именем id (нижний регистр). Правильно ли обрабатывает это новая версия без дополнительного атрибута? - person Dathan; 10.07.2014
comment
Вроде бы так и есть, да. Я думаю, что это, вероятно, больше элемент конфигурации в настройках сериализатора по умолчанию, который, однако, изменился в более новых версиях. JsonConvert.SerializeObject(new MyClass()) из коробки, похоже, использует имена сериализуемых свойств класса как есть. - person dan richardson; 11.07.2014