Параметризованный конструктор, вызывающий неожиданное поведение при десериализации в Json.NetC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Параметризованный конструктор, вызывающий неожиданное поведение при десериализации в Json.Net

Сообщение Anonymous »

using System;
using System.IO;

using Newtonsoft.Json;

public class PopulateTest
{
public static void Test()
{
JsonSerializer serializer = JsonSerializer.CreateDefault();
string json = "{\"Inner\":{\"Random\":\"a\",\"Value\":{\"num\":1}}}";
Outer outer = new();
using (StringReader reader = new(json)) {
serializer.Populate(reader, outer);
}
Console.Log(outer.Inner.Value.num);
}
}

public class Outer
{
public Outer() { }

public Inner Inner { get; set; }
}

public class Inner
{
[JsonConstructor]
protected Inner(string random)
{
Console.Log("Inner JSON constructor");
Random = random;
}

public string Random { get; }

public Value Value { get; } = new();
}

public class Value
{
public int num;

public Value() => Console.Log("Value constructor");
}

Вот пример кода, с которым я работаю. JSON {"Inner":{"Random":"a","Value":{"num":1}} выдает следующий результат:
Value constructor
Value constructor
Inner JSON constructor
0

Первый конструктор Value вызывается из библиотеки Json.Net из Newtonsoft.Json.Serialization.JsonSerializerInternalReader:CreateNewObject, а второй конструктор Value берется из начального значения.
Предполагаемое поведение заключается в том, чтобы заполнить значение, а не создавать новый объект, и, конечно же, для внешнего.Inner.Value.num будет равен 1 после десериализации. Однако при использовании конструктора по умолчанию (удаление случайной строки в качестве параметра для JsonConstructor Inner) он работает правильно. Результат этого:
Value constructor
Inner JSON constructor
1


Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-in-json
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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