2015-04-01 55 views
0

运行以下代码:ServiceStack.Text DynamicJson无法解析的阵列

var s = @"{ ""simple"": ""value"", ""obj"": { ""val"":""test"" }, ""array"": []"; 
var dyn = DynamicJson.Deserialize(s); 
Console.WriteLine(dyn.simple); 
Console.WriteLine(dyn.obj); 
Console.WriteLine(dyn.obj.val); 
Console.WriteLine(dyn.array); 

打印:

"value" 
{"val":"test"} 
base {System.Dynamic.DynamicObject}: {"val":"test"} 
"test" 
"[]" 

这意味着dyn.obj返回一个对象,所以我可以继续通过它,但dyn.array返回到导航一个string。这意味着我无法遍历里面的对象列表。

我错过了什么?

编辑

我想我已经找到了问题。寻找在github上在Pcl.Dynamic.cs方法YieldMember执行以下操作:

private bool YieldMember(string name, out object result) 
{ 
    if (_hash.ContainsKey(name)) 
    { 
     var json = _hash[name].ToString(); 
     if (json.TrimStart(' ').StartsWith("{", StringComparison.Ordinal)) 
     { 
      result = Deserialize(json); 
      return true; 
     } 
     result = json; 
     return _hash[name] == result; 
    } 
    result = null; 
    return false; 
} 

它负责转换开始{成反序列化(动态)对象值。

我知道@mythz在StackOverflow中查看问题,所以也许他可以用他的想法编造出来。当json以[开头的时候,似乎很简单。

编辑2

我正在考虑这个错误。所以我在代码中做了修正并提交了一个pull请求。如果有人想了解:

https://github.com/ServiceStack/ServiceStack.Text/pull/442

+0

做你尝试把任何东西*在*数组看到如何反序列化?如果它是空的,它不知道它打算容纳什么类型。 – DLeh 2015-04-01 20:07:59

+0

你也可以创建自己的类,它代表json所具有的相同格式,然后反序列化为该类型。这比使用'dynamic's好得多。 – DLeh 2015-04-01 20:09:05

+0

@DLeh我可以,但事实并非如此。我特意要将它解析为一个动态对象......我使用了替代方法,并且我知道它们的工作原理。我已经把数据放入数组中,结果是一样的。 – Alex 2015-04-01 20:22:58

回答