Десериализация ответов JSON, которые содержат атрибуты, конфликтующие с ключевыми словами - PullRequest
11 голосов
/ 12 января 2011

Есть API, который я не контролирую, но чей вывод мне нужно использовать с C #, предпочтительно с использованием JSON.Net.

Вот пример ответа:

[
    {
        "media_id": 36867, 
        "explicit": 0
    }
]

Я планировал создать такой класс:

class Media {
    public int media_id;
    public int explicit;
}

и десериализовать:

var l = JsonConvert.DeserializeObject<List<Media>>(s);

К сожалению, "явный" - это ключевое слово C #, поэтому его нельзя скомпилировать.1012 *

Мое следующее предположение - изменить класс:

class Media {
    public int media_id;
    public int explicit_;
}

... и каким-то образом сопоставить атрибуты ответа с атрибутами C #.

Как это сделать, илия полностью ошибаюсь в этом?

Если это не удастся, я буду в порядке, просто игнорируя "явное" в ответе, если есть способ сделать это?

Ответы [ 3 ]

18 голосов
/ 12 января 2011

Не использовал JSON.Net, но, судя по документам здесь , я считаю, что вам просто нужно сделать то, что вы сделали бы с XmlSerialization: добавьте атрибут, чтобы указать, каким должно быть свойство JSONназывается:

class Media {
    [JsonProperty("media_id")]
    public int MediaId;
    [JsonProperty("explicit")]
    public int Explicit;
}
11 голосов
/ 12 января 2011

C # позволяет вам определять члены с зарезервированными именами слов (для случаев совместимости точно так же, как это), экранируя их с помощью @, например,

class Media {
    public int media_id;
    public int @explicit;
}

Не знаю, как это работает с JSON.Net, но я бы предположил, что это должно работать (поскольку @ - это escape, а не часть имени поля).

1 голос
/ 18 января 2017

У меня работал следующий код.

class JsonRpc {
  public string id;
  public string method;
  public string[] @params;
}
JsonConvert.DeserializeObject<JsonRpc> (data)

Спасибо всем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...