使用ServiceStack反序列化嵌套的JSON对象

时间:2013-08-21 18:27:50

标签: c# json servicestack

我正在使用ServiceStack来序列化/反序列化JSON请求。我要做的是采用复杂的JSON对象(使用嵌套对象)并将其转换为嵌套对象的字典(Dictionary)。

例如,如果我有一个JSON对象,如:

{ a: "myA",
  b: { "myB", true}
}

我想要一个字典来反映这一点。因此,对于每个键/值:

key: a  value:  myA
key: b  value:  Dictionary<string, object> 
    key: myB   value: true

我试过

var dict = JsonSerializer.DeserializeFromString<Dictionary<string, object>>(request);

var dict = JsonObject.Parse(request);

我最终获得的是:

key: a  value:  myA
key: b  value:  "myB:true" 

注意我需要这个用于无限嵌套的Json对象(即我可以有3级,4级甚至5级深度)。

1 个答案:

答案 0 :(得分:3)

我试图为自定义会话状态模块执行此操作,并且在将需要类型数据的对象序列化为JSON时,您必须考虑许多边缘情况,默认情况下它没有类型的概念。一种简单的方法是强制ServiceStack使用

将类型信息序列化为JSON

JSConfig.includeTypeInfo = true;

在AppHost初始化方法中。这将告诉ServiceStack将“__type”属性包含到它序列化为JSON的每个对象中,包括字符串和整数以及基本类型。这代表了很多开销,特别是如果你在一个大型项目中,不需要每个序列化的类型信息。

或者,如果只需要这个嵌套对象Dictionary,则必须实现自己的类型系统。我最终做到了这一点,并且需要一段时间才能做好。

最后,来自Mythz(ServiceStack的主管)的这篇文章说,如果你把它序列化为一个接口,它将包含类型信息。我已经独立验证了这种情况,所以如果您可以控制嵌套字典中的内容并将它们全部限制为一个接口,则可以使其工作。

type info in ServiceStack JSON