【问题标题】:Deserialize json string back to expando using JavaScriptSerializer?使用JavaScriptSerializer将json字符串反序列化回expando?
【发布时间】:2015-04-22 09:41:05
【问题描述】:

我正在通过以下方式动态创建一个 json 对象(without 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"}]}]

回到扩展表示?

nb

我们不使用 JSON.net。

更新

我已设法将object[] 更改为IList&lt;IDictionary&lt;string,object&gt;&gt;

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

现在是:

但是,我需要将其转换为:

【问题讨论】:

  • this answer 会为您工作吗?一旦它成为一个对象,您就可以将其转换为 expando,对吗?
  • 没有。看看这里为什么i.imgur.com/1PnZ4T2.png(问题是因为数组结构)
  • 而不是通过 Expando 反序列化您是否尝试过Dictionary&lt;String, Object&gt;?如var jsonDeserizlied = new JavaScriptSerializer().Deserialize&lt;Dictionary&lt;String, Object&gt;&gt;(jsonString);
  • @PeterSmith 我相信这是一回事。 Expando 实现 IDictionary,
  • @RoyiNamir 啊...我明白你的意思,它不是在 single 字典中序列化每个属性,而是将它们分解为 3 个独立的。这似乎是序列化程序如何生成 JSON 的更多问题,因为从技术上讲,JSON 的表示并不表明它是单个对象。您是否尝试过先将 ExpandoObject 转换为 Dictionary&lt;string, object&gt; 然后然后反序列化为 JSON?

标签: c# json javascriptserializer


【解决方案1】:

知道了。

首先让我们处理它是一个IEnumerable&lt;&gt; 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);

结果:

正是我想要的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2019-02-28
    相关资源
    最近更新 更多