如何在JObject中为其他属性正确分配属性?

时间:2017-01-20 08:43:29

标签: c# json xml json.net

我想要实现的是将JObject转换为XML Document,然后从XMl Document中提取外部xml。这背后的原因是通过Azure Notification Hub将结果作为推送通知发送。

我想要的是:

<toast>
    <visual>
        <binding template="ToastGeneric">
            <text id="1">Message</text>
        </binding>
    </visual>
</toast> 

我尝试过:

JObject notificationPayload = new JObject(
    new JProperty("toast",
        new JObject(
            new JProperty("visual",
                new JObject(
                    new JProperty("binding",
                        new JObject(
                            new JProperty("@template", "ToastGeneric"),
                            new JProperty("text", notificationMessage,
                                new JProperty("@id", "1")))))))));

上面的代码抛出异常:Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray.所以我尝试过的是:

JObject notificationPayload = new JObject(
    new JProperty("toast",
        new JObject(
            new JProperty("visual",
                new JObject(
                    new JProperty("binding",
                        new JObject(
                            new JProperty("@template", "ToastGeneric"),
                            new JProperty("text", notificationMessage,
                                new JObject(
                                    new JProperty("@id", "1"))))))))));

上面的代码给了我一个结果,但不是预期的结果。我得到的是:

<toast>
    <visual>
        <binding template="ToastGeneric">
            <text>Message</text>
            <text id="1" />
        </binding>
    </visual>
</toast>

提取Xml从JObject我使用以下方法:

string jsonStringToConvertToXmlString = JsonConvert.SerializeObject(notificationPayload);
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonStringToConvertToXmlString);
return doc.OuterXml;

问题:如何将id属性赋予相同的Text属性?

1 个答案:

答案 0 :(得分:4)

基本上,不要使用面向JSON的工具来构造XML。如果您已经拥有 JSON,那么使用Json.NET将其转换为XML是有意义的 - 但是当您从头开始构建它时,使用LINQ to XML会更加清晰:

XDocument doc = new XDocument(
    new XElement("toast",
        new XElement("visual",
            new XElement("binding",
                new XAttribute("template", "ToastGeneric"),
                new XElement("text",
                    new XAttribute("id", 1),
                    "Message"
                )
            )
        )
    )
);