使用JavaScriptSerializer将json字符串反序列化为expando?

时间:2015-04-22 09:41:06

标签: c# json javascriptserializer

我通过以下方式动态创建一个json对象(不带 Json.net):

dynamic expando = new ExpandoObject();
expando.Age = 42;
expando.Name = "Royi";
expando.Childrens = new ExpandoObject();
expando.Childrens.First = "John"; 

看起来像:

enter image description here

所以,我可以查询它:

Console.WriteLine (expando.Name); //Royi

好的,让我们序列化它:

var jsonString = new JavaScriptSerializer().Serialize(expando);
Console.WriteLine (jsonString);

结果:

[{"Key":"Age","Value":42},{"Key":"Name","Value":"Royi"},{"Key":"Childrens","Value":[{"Key":"First","Value":"John"}]}]

注意expando(字符串,对象的Idictionary)如何保存数据

问题

现在我希望将字符串反序列化为:

enter image description here

我试过了:

var jsonDeserizlied = new JavaScriptSerializer().Deserialize<ExpandoObject>(jsonString);

但是:

键入&#39; System.Dynamic.ExpandoObject&#39;不支持反序列化数组。

那么,我怎样才能获得

 [{"Key":"Age","Value":42},{"Key":"Name","Value":"Royi"},{"Key":"Childrens","Value":[{"Key":"First","Value":"John"}]}]

回到expando表示?

nb的

我们不使用JSON.net。

更新

我设法将object[]更改为IList<IDictionary<string,object>>

 var jsonDeserizlied = new JavaScriptSerializer().Deserialize<IList<IDictionary<string,object>>>(jsonString);

现在是:

enter image description here

但同样,我需要将其转换为:

enter image description here

1 个答案:

答案 0 :(得分:3)

得到它。

首先让我们处理它是IEnumerable<> Json表示的事实(因为ExpandoObject如何通过JavaScriptSerializer序列化),所以:

var jsonDeserizlied = new   JavaScriptSerializer().Deserialize<IEnumerable<IDictionary<string,object>>>(jsonString);
 Console.WriteLine (jsonDeserizlied);

我还编写了这个递归函数,以递归方式创建ExpandoObject和子子展开:

public ExpandoObject go( IEnumerable<IDictionary<string,object>> lst)
{

 return lst.Aggregate(new ExpandoObject(),
                           (aTotal,n) => {
                                (aTotal    as IDictionary<string, object>).Add(n["Key"].ToString(), n["Value"] is object[] ? go(  ((object[])n["Value"]).Cast<IDictionary<string,Object>>())  :n["Value"] );
                                return aTotal;
                           });

}

是的,我知道它可以改进,但我只是想表明这个想法。

现在我们通过以下方式调用它:

var tt=   go(jsonDeserizlied);

结果:

enter image description here

完全我想要的。

Console.WriteLine (tt.Age ); //52