从动态ExpandoObject生成JSON字符串

时间:2019-06-13 20:47:45

标签: c# json expandoobject

我正在使用C#,并尝试从 dynamic 对象生成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}]

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

2 个答案:

答案 0 :(得分:4)

只需下载 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 是在运行时定义字段的对象,与在编译时定义field / properties / methods ..的常规对象不同。为了能够在运行时定义它们,expando对象内部包含一个词典,该词典是键值对的集合。

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

答案 1 :(得分:2)

使用Newtonsoft.Json工具:

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

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

这就是我的方法。