我正在尝试将一些旧作品转换为使用 Newtonsoft JSON.NET.使用 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize 方法的默认处理(例如,如果没有指定目标类型)是返回 Dictionary用于内部对象.
I'm trying to convert some older work to use Newtonsoft JSON.NET. The default handling using the System.Web.Script.Serialization.JavaScriptSerializer.Deserialize method (e.g. if no target type is specified) is to return a Dictionary<string,object> for inner objects.
这实际上是一个非常有用的 JSON 基本类型,因为它也恰好是 ExpandoObjects 使用的底层类型,并且是动态类型最明智的内部实现.
This is actually a really useful basic type for JSON since it also happens to be the underlying type used by ExpandoObjects and is the most sensible internal implementation for dynamic types.
如果我指定这种类型,例如:
If I specify this type, e.g.:
var dict = JsonConvert.DeserializeObject<Dictionary<string,object>>(json);
JSON.NET 将正确反序列化最外层的对象结构,但它会为任何内部结构返回 JObject 类型.我真正需要的是将相同的外部结构用于任何内部对象类型结构.
JSON.NET will deserialize the outermost object structure correctly, but it returns a JObject type for any inner structures. What I really need is for the same outer structure to be used for any inner object-type structures.
有没有办法指定用于内部对象的类型,而不仅仅是返回的最外层类型?
Is there a way to specify a type to be used for inner objects, and not just the outermost type returned?
使用Json反序列化复杂对象时,需要添加一个JsonSerializer Settings作为参数.这将确保所有内部类型都能正确反序列化.
When Deserializing your complex objects using Json, you need to add a JsonSerializer Settings as a parameter. This will ensure that all of the inner types get deserialized properly.
private JsonSerializerSettings _jsonSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full
};
序列化对象时,可以使用 SerializerSettings:
When Serializing your object, you can use the SerializerSettings:
string json= JsonConvert.SerializeObject(myObject, _jsonSettings)
然后在反序列化时,使用:
Then when you are deserializing, use:
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, _jsonSettings);
另外,当你序列化时,将 JsonSerializerSettings 添加到你的 SerializeObject(object, settings)
Also, when you serialize, add the JsonSerializerSettings to your SerializeObject(object, settings)
如果需要,您还可以更改 TypeNameHandling 和 TypeNameAssemblyFormat.我将它们分别设置为全部"和完整",以确保我的复杂对象毫无疑问地正确序列化和反序列化,但智能感知为您提供其他选择
You can also change the TypeNameHandling and TypeNameAssemblyFormat if you need to. I have them set at 'All' and 'Full' respectively to ensure that my complex objects get serialized and deserialized properly without doubt, but intellisense provides you with other alternatives
这篇关于将 JSON 递归反序列化为 IDictionary<string,object>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
读取 XML 时忽略空格Ignore whitespace while reading XML(读取 XML 时忽略空格)
带有检查空元素的 XML 到 LINQXML to LINQ with Checking Null Elements(带有检查空元素的 XML 到 LINQ)
在 C# 中读取带有未闭合标签的 XMLReading XML with unclosed tags in C#(在 C# 中读取带有未闭合标签的 XML)
在 C# 中使用 Html 敏捷性解析表格、单元格Parsing tables, cells with Html agility in C#(在 C# 中使用 Html 敏捷性解析表格、单元格)
使用 LINQ 从 xml 中删除元素delete element from xml using LINQ(使用 LINQ 从 xml 中删除元素)
解析格式错误的 XMLParse malformed XML(解析格式错误的 XML)