运行以下代码: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
做你尝试把任何东西*在*数组看到如何反序列化?如果它是空的,它不知道它打算容纳什么类型。 – DLeh 2015-04-01 20:07:59
你也可以创建自己的类,它代表json所具有的相同格式,然后反序列化为该类型。这比使用'dynamic's好得多。 – DLeh 2015-04-01 20:09:05
@DLeh我可以,但事实并非如此。我特意要将它解析为一个动态对象......我使用了替代方法,并且我知道它们的工作原理。我已经把数据放入数组中,结果是一样的。 – Alex 2015-04-01 20:22:58