Подтвердить что ты не робот

Deserialize свойство как ExpandoObject с использованием JSON.NET

Например, существует такой объект, как следующий:

public class Container
{
   public object Data { get; set; }
}

И он использовал этот способ:

Container container = new Container
{
    Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};

Если я десериализую строку JSON, полученную после сериализации вышеуказанного экземпляра, свойство Data, даже если я предоставляю ExpandoObjectConverter, он не десериализуется как ExpandoObject:

Container container = JsonConvert.Deserialize<Container>(jsonText, new ExpandoObjectConverter());

Как я могу десериализовать свойство класса, назначенное анонимным объектом или, по крайней мере, не конкретным типом, как ExpandoObject?

EDIT:

Кто-то ответил, что я могу просто использовать динамический объект. Это не сработает для меня. Я знаю, что я мог бы пойти этим путем, но это не так, потому что мне нужен ExpandoObject. Спасибо.

ИЗМЕНИТЬ 2:

Некоторые другие пользователи ответили, что я могу десериализовать строку JSON в ExpandoObject. Это не цель этого вопроса. Мне нужно десериализовать конкретный тип, обладающий динамическим свойством. В строке JSON это свойство может быть ассоциативным массивом.

4b9b3361

Ответ 1

Попробуйте следующее:

Container container = new Container
{
    Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};

string jsonText = JsonConvert.SerializeObject(container);

var obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonText, new ExpandoObjectConverter());

Я обнаружил, что это сделало мне ExpandoObject из вызова DeserializeObject. Я думаю, что проблема с кодом, который вы указали, заключается в том, что, пока вы поставляете ExpandoObjectConverter, вы запрашиваете Json.Net для десериализации Container, поэтому я бы предположил, что ExpandoObjectConverter не используется.

Edit:

Если я украшаю свойство Data [JsonConverter(typeof(ExpandoObjectConverter))] и использую код:

var obj = JsonConvert.DeserializeObject<Container>(jsonText);

Затем свойство Data десериализуется до ExpandoObject, а obj - это Container.