通过动态忽略C#关键字来序列化JSON

时间:2018-12-20 19:48:24

标签: json.net

我正在使用Json.net,它所需要的只是创建JSON字符串以HTTP POST形式发送的最简单形式。因此,我不想创建一个新的自定义对象只是为了能够正确地序列化它。所以我在Json.net中选择了动态方法。

我需要的JSON看起来像这样:

{
  root: {
    header: {
        namespace: "",
        name: ""
        },
    body:   {
        email: email
        myArray:[
            {
                item1: "",
                item2: ""
            },
            {
                item3: "",
                item4: ""
            },
        ]
        }
    }
}

所以我尝试执行以下操作:

dynamic httpRequestBody = new JObject();
httpRequestBody.root = new JObject();
httpRequestBody.root.header = new JObject();
httpRequestBody.root.header.namespace = "";
httpRequestBody.root.header.name = "name;

但是,由于“命名空间”是C#关键字,因此不允许我使用它。因为我需要“名称空间”作为JSON的一部分,所以有没有解决的方法?如果没有,那么创建此JSON字符串的最简单方法是什么?

为澄清起见,对于创建自己的小类并对其进行序列化,我没有很强的见解,但由于我只需要发送一些jSON并将其遗忘,因此感觉像是,我应该能够创建即时进行。

1 个答案:

答案 0 :(得分:1)

与其将您的JObject转换为dynamic,而不是将其保留为显式类型的变量。 JObject实现IDictionary<string, JToken>,可以与implicit conversion operators from primitive types to JToken一起使用,以将任何名称的属性值设置为任何原始值或其他JToken

var header = new JObject();
header["namespace"] = ""; // Here we use the implicit operator from string to JToken
header["name"] = "name";

httpRequestBody["root"]["header"] = header;

使用显式类型还可以在编译时检查代码的正确性,并且可能improve performance

演示小提琴here