从动态 ExpandoObject 生成 JSON 字符串

Generate JSON string from dynamic 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);

(注意,以上内容需要引用 System.Web.Helpers 程序集。)

我希望它能输出字符串:

{"name":"John","wins":42}

但它实际输出:

[{"Key":"name","Value":"John"},{"Key":"wins","Value":42}]

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

使用 Newtonsoft.Json 工具:

using Newtonsoft.Json;
/// skip a bunch of other implementation details. 

var json = Newtonsoft.Json.JsonConvert.SerializeObject(reply);

我就是这样做的。

只需下载 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);

编辑:

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

ExpandoObject 是一个对象,其字段在 运行时 定义,不同于 fields/properties/methods ..定义在 compile-time。为了能够在 run-time 处定义它们,expando 对象在内部包含一个字典,它是 key-value 对的集合。

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