在ServiceStack.Text中反序列化通用对象

时间:2018-03-16 19:38:53

标签: servicestack-text

我试图找到一个解决方案,用于将匿名对象从JSON反序列化为类似ServiceStack.Text中原始JSON结构的结构,但我找不到任何可接受的解决方案。虽然我确实知道反序列化器没有关于如何反序列化通用对象的线索,但我已经准备好指出一些规则,如:

  • 用于任何通用对象的字典< string,object>或者ExpandoObject,无论解串者最喜欢哪个
  • 用于列表< object>
  • 的任何列表

我尝试反序列化为Dictionary< string,object>,但条目都是字符串,无论我是否有复杂的对象,甚至是列表。接下来的尝试是使用ExpandoObject,这稍微好一些,将列表识别为List< object>,但里面的对象都是字符串。我假设对于具有上述两个规则的场景,它应该是一个简单的配置问题,但我没有发现任何可能性。

有没有人有解决这个难题的线索?提前谢谢。

1 个答案:

答案 0 :(得分:0)

似乎以下设置可以解决问题:

JsConfig.ConvertObjectTypesIntoStringDictionary = true;
JsConfig.TryToParsePrimitiveTypeValues = false; // otherwise, for untyped jsons, any string value which can't be converted to primitive types will return null.

var dictionary = ServiceStack.Text.JsonSerializer.DeserializeFromString(json, typeof(object));

另一个选项是ServiceStack.Text提供的DynamicJson类,但实现不会保留JSON中的原始名称。

对于替代实现,请检查Kephas Framework中的JsonExpando类(https://github.com/quartz-software/kephas/blob/master/src/Kephas.Serialization.ServiceStack.Text/JsonExpando.cs)。重要提示:请使用JsonConfig中的上述设置。