Как классы С# обрабатывают знаки доллара в JSON?

Я получаю фид JSON от API данных Google и многое другое. имена свойств начинаются с символа $ (знак доллара).

Моя проблема в том, что я не могу создать класс С# с именем переменной, начинающимся со знака доллара, это не разрешено языком. Я использую JSON.NET от Newtonsoft для преобразования JSON в объекты C#. Как я могу обойти эту проблему?


person Johnathan Sewell    schedule 09.01.2011    source источник


Ответы (3)


Вы можете попробовать использовать атрибут [JsonProperty], чтобы указать имя:

[JsonProperty(PropertyName = "$someName")]
public string SomeName { get; set; }
person Darin Dimitrov    schedule 09.01.2011

firas489 был на правильном пути, говоря, что $ указывает на метаданные, а не на фактическое поле данных. Однако исправление на самом деле заключается в следующем:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;            

Установите обработку метаданных для игнорирования, а затем вы можете сериализовать/десериализовать свойство с помощью атрибута PropertyName:

[JsonProperty("$id")]
public string Id { get; set; }
person Greg Ennis    schedule 09.09.2015

Элементы со знаком доллара ($) обычно предназначены для метаданных, а НЕ полей. Когда JSON.NET сериализует объект и вы указываете ему обрабатывать типы объектов, он будет вставлять элементы $, которые обозначают метаданные для правильной десериализации позже.

Если вы хотите обрабатывать элементы $ как метаданные, используйте JsonSerializerSettings. Например:

Dim jsonSettings As New Newtonsoft.Json.JsonSerializerSettings With {.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All}
Dim jsonOut As String = Newtonsoft.Json.JsonConvert.SerializeObject(objects, jsonSettings)

TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All указывает JSON обрабатывать типы данных, полагаясь на $ для получения информации.

Надеюсь, это поможет..

person firas489    schedule 19.11.2014
comment
То есть у меня по сути обратная задача? Я пишу инструмент для создания схемы json, и мне нужно вывести $schema, $id, #ref и тому подобное. Я борюсь с хорошим способом приблизиться к этому, текущая мысль состоит в том, чтобы потенциально иметь что-то, что запускает сообщение, которое заменит «id» на «$ id», но кажется неуклюжим. Рад разместить это в новом вопросе, если это необходимо. - person Jeff Patton; 30.11.2020