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 это свойство может быть ассоциативным массивом.
Ответы
Ответ 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
.