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

4
我有一个json对象,想要将其反序列化为.Net类型而不需要进行强制转换。
我记得在文档的某个地方看到过,可以通过在json中传递一个属性来告诉反序列化器它可以尝试转换的.Net对象类型。
但我找不到这个信息出处。
我希望避免使用:
var myNewObject = JsonConvert.DeserializeObject<MyClass>(json);

要获得像这样的结果
MyClass myNewObject = JsonConvert.DeserializeObject(json);

我从HttpRequest中获取了我的json对象,并希望从这个嵌套对象中实例化适当的类。 目前,已知项的反序列化效果很好,但需要更灵活的方法,而不需要管理所有已知对象来解析方法。

2
你为什么想要排除泛型?从中获得了什么好处? - Liam
你是说你想让这个类是动态的吗?MyClass 部分有点令人困惑。 - Liam
为什么你不想传递一个泛型参数? - Dhunt
我认为这项工作也可以通过通用的处理过程完成,但我正在寻找的是@croxy的答案。 - Leze
3个回答

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
这正是我正在寻找的。谢谢。 - Leze
如果我想反序列化一个包含在另一个 jsonObject 中的对象,例如:我有一个 jsonObject 如下: {"$type":"ServerResponse","message":"text","error":"error","result":[{"$type":"fooClass","message":"message"}]} - Leze
像这样的代码能否满足您的要求:dynamic myObject = JsonConvert.DeserializeObject(json, Settings); 然后 var insideObject = myObject.result?还是需要更加灵活的方法?因为目前我想不到其他的做法。 - croxy

2
您可以执行以下操作:
dynamic myNewObject = JsonConvert.DeserializeObject(json);

该函数将返回一个动态对象,您可以使用它进行操作。

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

显然,如果您的JSON不包含具有“描述”属性的对象的“数据”数组,则会失败。

0
你可以像这样做:
var result = JsonConvert.DeserializeObject<dynamic>(json);

所以你可以反序列化任何对象。动态类型转换表示你正在反序列化一个在运行时将被知道其类型的匿名对象。它确实有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接