Можно ли сгладить (скрыть) имя переменной словаря? - PullRequest
0 голосов
/ 05 декабря 2018

Пока возился с классом, который я хотел бы сериализовать в JSON, я столкнулся с ситуацией, которую я не знаю, как лучше решить.Это связано со структурой JSON, которая имеет как фиксированные, так и случайные атрибуты (Fixed: всегда одно и то же имя атрибута, Random: их имена случайные).Кроме того, фиксированные атрибуты всегда имеют тип string, а случайные атрибуты всегда имеют тип MyJsonClass2.

Например:

{
 "fixedName1": "value1",
 "fixedName2": "value2",
 "randomName1": { ... },
 "randomNameN": { ... }
}

Это может быть представлено с помощью Dictionary<string, object>.Однако, поскольку fixedName1 и fixedName2 всегда задаются, я бы хотел, чтобы они были фиксированными объявлениями и имели переменные в словаре, как указано ниже:

class MyJson
{
    public string fixedName1 = "blah1";
    public string fixedName2 = "blah2";

    public Dictionary<string, MyJsonClass2> randomNames = new Dictionary<string, MyJsonClass2>();
}

Проблема в том, что когдаэто сериализуется, значения из randomNames заключены в атрибут с именем randomNames, что имеет смысл, однако это не то, что я хотел бы видеть.Есть ли способ сообщить сериализатору JSON Newtonsoft игнорировать имя словаря?Или как лучше определить такой класс?

1 Ответ

0 голосов
/ 05 декабря 2018

В вашем json некоторые из ваших данных ключ / значение являются фиксированными, а некоторые из данных пары ключ / значение являются случайными или просто говорят, что они динамические.

Затем вы можете объявить свойства для фиксированной пары ключ / значение.но проблема возникла, когда возникла его динамика, и вопрос, который вы задали.

Итак, у Newtonsoft.json есть одна особенность, которая будет использоваться здесь, и это [JsonExtensionData]. Подробнее

Данные расширения теперь записываются при сериализации объекта.Чтение и запись данных расширения позволяет автоматически выполнять обход всех JSON без добавления каждого свойства к типу .NET, к которому вы десериализуетесь.Объявляйте только те свойства, которые вас интересуют, и позволяйте данным расширения делать все остальное.

Теперь вы можете добавить свойства для парных данных с фиксированным ключом / значением следующим образом.

public string fixedName1 {get;set;}
public string fixedName2 {get;set;}

А для динамической или случайной пары ключ / значение необходимо украсить свойство Dictionary с помощью [JsonExtensionData].как

[JsonExtensionData]
public Dictionary<string, JToken> randomNames {get;set;}

Таким образом, ваш класс будет выглядеть как

class MyJson
{
    public string fixedName1 {get;set;}
    public string fixedName2 {get;set;}

    [JsonExtensionData]
    public Dictionary<string, JToken> randomNames {get;set;}
}

Теперь попробуйте сериализовать ваши данные с указанным выше классом, вы никогда не получите имя словаря в выходном сериализованном json.

Вы можете попробовать выше класса, как

MyJson myJson = new MyJson();
myJson.fixedName1 = "ABC";
myJson.fixedName2 = "PQR";
myJson.randomNames = new Dictionary<string, JToken>();
myJson.randomNames.Add("randomName1", JToken.FromObject(new MyJsonClass2 { Name = "QWERTY" }));
myJson.randomNames.Add("randomNameN", JToken.FromObject(new MyJsonClass2 { Name = "ZXCVBNM" }));

string json = JsonConvert.SerializeObject(myJson);

Выход:

enter image description here

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