从动态 ExpandoObject 生成 JSON 字符串

Wyc*_*yck 9 c# json expandoobject

我正在使用 C# 并尝试从动态对象生成 JSON 字符串。

dynamic reply = new System.Dynamic.ExpandoObject();
reply.name = "John";
reply.wins = 42;
string json = System.Web.Helpers.Json.Encode(reply);
System.Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)

(注意,上面需要对 System.Web.Helpers 程序集的引用。)

我希望这能输出字符串:

{"name":"John","wins":42}
Run Code Online (Sandbox Code Playgroud)

但它实际上输出:

[{"Key":"name","Value":"John"},{"Key":"wins","Value":42}]
Run Code Online (Sandbox Code Playgroud)

我需要更改什么才能获得我希望的输出?

car*_*rio 11

只需下载Newtonsoft.Json Nuget 包。

这是在 c# 中使用 json 的首选方式。您使用Newtonsoft 的代码将是:

    dynamic reply = new System.Dynamic.ExpandoObject();
    reply.name = "John";
    reply.wins = 42;
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(reply);
    System.Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)

编辑:

我只是想更好地解释为什么在使用该System.Web.Helpers.Json.Encode方法时会得到该结果。

一个ExpandoObject是哪些字段在定义的对象的运行时,比字段/属性/方法..是在编译时定义的正则对象不同。为了能够在运行时定义它们, expando 对象在内部保存了一个字典,它是一个键值对的集合。

我不知道这个助手是如何工作的,但它可能只是一个简单的序列化器,这就是为什么它序列化为键值对数组而不是您期望的实际对象。Newtonsoft.Json 库几乎是 c# 项目的标准,并且显然知道 Expando 对象在内部是如何工作的。

  • 我真的很感谢您对 Web.Helpers 实现如何不如 Netwonsoft.Json 实现的见解。我当然会对 Web.Helpers 提出一个功能请求,即有一个序列化选项可以以预期的方式处理 ExpandoObject。Web.Helpers 的当前功能是合乎逻辑的(正如您所描述的),但它对于 ExpandoObject 根本没有用。 (2认同)