使用NewtonSoft将JSON对象反序列化为.Net对象

我有一个json对象,我想反序列化到它的.Net类型而不用它。

我想我在doc中的某处读到你可以将一个属性传递给json,告诉反序列化器它可以尝试强制转换的.Net对象类型。

我找不到我读到的地方。

我想避免使用

var myNewObject = JsonConvert.DeserializeObject(json); 

得到这样的东西

 MyClass myNewObject = JsonConvert.DeserializeObject(json); 

我从HttpRequest获取了我的json对象,并希望从这个嵌套对象中实例化相应的类。 目前对已知项目的反序列化工作良好,但需要更灵活的东西,而无需从解析方法管理所有已知的Object。

您可以像这样在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字符串时,您不必担心正确的类型。

您可以执行以下操作:

 dynamic myNewObject = JsonConvert.DeserializeObject(json); 

这将返回一个可以使用的动态对象。

 Console.WriteLine(myNewObject.data[0].description); 

显然,如果您的JSON不包含具有带description属性的对象的data数组,它将失败。

你可以这样做:

 var result = JsonConvert.DeserializeObject(json); 

所以你可以反序列化任何对象。 Cast动态表示您正在使用在运行时已知的任何类型反序列化任何类型的对象。 它真的很棒!