使用 JavaScriptSerializer 将 json 字符串反序列化回 expando?
Deserialize json string back to expando using JavaScriptSerializer?
我正在动态创建一个 json 对象( 没有 Json.net )通过:
dynamic expando = new ExpandoObject();
expando.Age = 42;
expando.Name = "Royi";
expando.Childrens = new ExpandoObject();
expando.Childrens.First = "John";
看起来像:
所以,我可以这样查询它:
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(字符串、对象的字典)是如何保存数据的
问题
现在我希望将字符串反序列化回:
我试过了:
var jsonDeserizlied = new JavaScriptSerializer().Deserialize<ExpandoObject>(jsonString);
但是:
数组的反序列化不支持类型 'System.Dynamic.ExpandoObject'。
那么,我怎样才能得到
[{"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);
现在是:
但同样,我需要将其转换为:
知道了。
首先让我们处理它是 IEnumerable<>
Json 表示的事实(因为 ExpandoObject
如何通过 JavaScriptSerializer
序列化),所以:
var jsonDeserizlied = new JavaScriptSerializer().Deserialize<IEnumerable<IDictionary<string,object>>>(jsonString);
Console.WriteLine (jsonDeserizlied);
我还编写了这个递归函数,它递归地创建 ExpandoObject
和 sub sub expandos:
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);
结果:
正是我想要的。
Console.WriteLine (tt.Age ); //52
我正在动态创建一个 json 对象( 没有 Json.net )通过:
dynamic expando = new ExpandoObject();
expando.Age = 42;
expando.Name = "Royi";
expando.Childrens = new ExpandoObject();
expando.Childrens.First = "John";
看起来像:
所以,我可以这样查询它:
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(字符串、对象的字典)是如何保存数据的
问题
现在我希望将字符串反序列化回:
我试过了:
var jsonDeserizlied = new JavaScriptSerializer().Deserialize<ExpandoObject>(jsonString);
但是:
数组的反序列化不支持类型 'System.Dynamic.ExpandoObject'。
那么,我怎样才能得到
[{"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);
现在是:
但同样,我需要将其转换为:
知道了。
首先让我们处理它是 IEnumerable<>
Json 表示的事实(因为 ExpandoObject
如何通过 JavaScriptSerializer
序列化),所以:
var jsonDeserizlied = new JavaScriptSerializer().Deserialize<IEnumerable<IDictionary<string,object>>>(jsonString);
Console.WriteLine (jsonDeserizlied);
我还编写了这个递归函数,它递归地创建 ExpandoObject
和 sub sub expandos:
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);
结果:
正是我想要的。
Console.WriteLine (tt.Age ); //52