Десериализация из Json с использованием существующих подобъектовC#

Место общения программистов C#
Ответить
Anonymous
 Десериализация из Json с использованием существующих подобъектов

Сообщение Anonymous »

Вот моя ситуация: я пытаюсь использовать Newtonsoft.Json 13.0.3 для десериализации с использованием уже созданных данных.
Я знаю, что это существует: JsonConvert.PopulateObject, но это не так. сделай свое дело, будь со мной.

Код: Выделить всё

// MainData, a class we will let Json.net instanciate
public class MainData
{
[JsonProperty]
private List _smallerDataArray = new();
}

// SmallerData, a class we do not want Json.net to instanciate
public class SmallerData
{
public int myInt;
}
Представьте себе следующие MainData, сериализованные в строку json с именем «jsonString»

Код: Выделить всё

{
"$type":"MainData",
"_smallerDataArray":
{
"$type":"List"
[
{
"$type":"SmallerData",
"myInt":"0"
},
{
"$type":"SmallerData",
"myInt":"1"
},
{
"$type":"SmallerData",
"myInt":"2"
}
]
}
}
Обычно код десериализации выглядит так

Код: Выделить всё

public static MainData DeserializeNormaly(string jsonString)
{
// here Json.net will create 3 SmallerData instances via RTTI
return JsonConvert.DeserializeObject(jsonString);
}
Но мне бы хотелось, чтобы это выглядело примерно так (этот код не компилируется)

Код: Выделить всё

public class Example
{
// Creating a pool of 3 SmallerData for the example's sake
List _pooledData = new() { new SmallerData(), new SmallerData(), new SmallerData());

public object MyObjectFactory(Type objectType)
{
if(objectType == typeof(SmallerData))
{
// Detecting a type we can instaniate from a pool
SmallerData smallerDataInstance = _pooledData[0];
_pooledData.RemoveAt(0);
return smallerDataInstance;
}
// Relying of default object creation
return null;
}

public MainData DeserializeFromPool(string jsonString)
{

JsonSerializerSettings settings = new();
settings.ObjectFactory = MyObjectFactory;

// here Json.net will create 3 SmallerData instances via RTTI
return JsonConvert.DeserializeObject(jsonString, settings);
}
}
Почему-то мне бы хотелось, чтобы JsonConvert.DeserializeObject извлекал данные из пула при создании экземпляра SmallerData вместо создания новых.
Я изучал контракты преобразователей, что такое еще много чего, но не нашел способа. Кто-нибудь пробовал это раньше?
Если вам интересно, почему я пытаюсь это сделать: это одна из многих попыток, которые я предпринимаю, чтобы уменьшить количество мусора во время использования json.< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... ub-objects
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»