Как применять JsonExtensionData (словарь) к другому объекту с помощью JSON.Net - PullRequest
0 голосов
/ 13 октября 2018

Я столкнулся с этим (на первый взгляд обычным) сценарием, но не смог найти удовлетворительного решения.Может быть, кто-то знает:

По какой-то причине я анализирую JSON и разрешаю пользователю предоставлять больше пар ключ-значение, чем у моего класса.Я храню произвольные, например, так:

class MusterNode
{
    // some definite property
    public string TypeName { get; set; }

    // takes the rest
    // see https://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm
    [JsonExtensionData]
    private Dictionary<string, JToken> _extparams;
}

Если я десериализирую что-то вроде

{
   "TypeName": "a",
   "stuff": 3
}

Будет установлено TypeName, а в моих _extparams содержится ключ "stuff".

По какой-то причине я хочу применить эти сохраненные данные к другому (только что созданному) объекту 'obj' (на самом деле параметры были заданы для этого типа с именем).Итак, у меня есть словарь и объект.Есть ли способ «применить» словарь без предварительной сериализации?

Мое неудовлетворительное решение таково:

string json = JsonConvert.SerializeObject(_extparams);
JsonConvert.PopulateObject(json, obj);

, украшенный некоторыми JsonSerializerSettings, это работает для меня.Но это делает ненужную работу.

1 Ответ

0 голосов
/ 13 октября 2018

В Json.Net нет метода, который будет заполнять объект напрямую из стандартного словаря.В конце концов, это библиотека сериализации, а не библиотека отображений.Тем не менее, есть способ заставить его работать без промежуточного этапа сериализации / десериализации.

Во-первых, вместо использования Dictionary<string, JToken> в качестве контейнера для ваших параметров [JsonExtensionData], используйте JObject.JObject реализует IDictionary<string, JToken>, поэтому он по-прежнему будет работать, чтобы перехватить дополнительные свойства.

class MusterNode
{
    ...
    [JsonExtensionData]
    private JObject _extparams;
}

Затем, чтобы заполнить другой объект, вам просто нужно создать читатель из JObject и передатьэто JsonSerializer.Populate() вот так:

new JsonSerializer().Populate(_extparams.CreateReader(), obj);

Если у вас есть нужные настройки сериализации, вы можете установить их непосредственно на JsonSerializer до вызова Populate().

Здесьрабочая демоверсия: https://dotnetfiddle.net/kIzc5G

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