从动态ExpandoObject生成JSON字符串

13

我正在使用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}]

我需要改变什么才能得到我想要的输出?


1
你应该使用 Newtonsoft.Json。Nuget链接:https://www.nuget.org/packages/Newtonsoft.Json/ - Glenn Ferrie
2个回答

19

只需下载 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 是一个对象,其字段的定义是在运行时而不是像常规对象那样在编译时定义的。为了能够在运行时定义它们,可扩展对象在内部持有一个字典,这是一组键值对的集合。

我不知道该助手是如何工作的,但它可能只是一个简单的序列化程序,因此它将序列化为键值对数组,而不是您期望的实际对象。库 Newtonsoft.Json 几乎成为 c# 项目的标准,显然了解 Expando 对象的内部工作原理。


1
我非常感谢您对Web.Helpers实现与Netwonsoft.Json实现的见解。我一定会为Web.Helpers提出一个功能请求,以便有一个序列化选项可以按预期方式处理ExpandoObject。Web.Helpers的当前功能(正如您所描述的)是合乎逻辑的,但对于ExpandoObject来说根本没有用处。 - Wyck

3
使用 Newtonsoft.Json 工具:
using Newtonsoft.Json;
/// skip a bunch of other implementation details. 

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

这就是我所做的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接