我有一个json对象,我希望反序列化为.Net类型而不进行强制转换。
我想我在doc中的某个地方读到你可以将一个属性传递给json,告诉反序列化器它可以尝试强制转换的.Net对象类型。
我找不到我读到的地方。
我想避免使用
var myNewObject = JsonConvert.DeserializeObject<MyClass>(json);
得到这样的东西
MyClass myNewObject = JsonConvert.DeserializeObject(json);
我从HttpRequest获取了我的json对象,并希望从这个嵌套对象中实例化相应的类。 目前对已知项目的反序列化工作正常,但需要更灵活的东西,而无需从解析方法管理所有已知的Object。
答案 0 :(得分:6)
您可以像这样在json字符串中保存对象类型。
您必须交出转换器的设置
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
};
如何使用给定设置进行序列化:
var json = JsonConvert.SerializeObject(data, Settings);
这是你的json字符串的样子:
{
"$type":"YourNamespaceOfTheClass",
"YourPropertyInTheClass":valueOfProperty
}
如何使用给定的设置进行反序列化:
var object = JsonConvert.DeserializeObject(json, Settings);
现在,您的json字符串不仅包含序列化对象,还包含序列化对象的类型。因此,在反序列化json字符串时,您不必担心正确的类型。
答案 1 :(得分:2)
您可以执行以下操作:
dynamic myNewObject = JsonConvert.DeserializeObject(json);
将返回一个可以使用的动态对象。
Console.WriteLine(myNewObject.data[0].description);
显然,如果您的JSON不包含具有data
属性的对象的description
数组,则会失败。
答案 2 :(得分:0)
您可以这样做:
var result = JsonConvert.DeserializeObject<dynamic>(json);
所以你可以反序列化任何对象。 Cast动态表示您将使用在运行时已知的任何类型反序列化任何类型的对象。它真的很有效!