将JSON转换为XML

18

我尝试将JSON输出转换为XML。不幸的是,我遇到了以下错误:

JSON根对象具有多个属性。为了创建有效的XML文档,根对象必须具有单个属性。考虑指定一个DeserializeRootElementName。

这是我现在创建的内容。

string url = string.Format("https://graph.facebook.com/{0}?fields=posts.fields(message)&access_token={1}", user_name, access_token);

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());
    jsonOutput = reader.ReadToEnd();
    Console.WriteLine("THIS IS JSON OUTPUT: " + jsonOutput);
}
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(jsonOutput);
Console.WriteLine(doc);

这是我的JSON输出:

{"id":"108013515952807","posts":{"data":[{"id":"108013515952807_470186843068804","created_time":"2013-05-14T20:43:28+0000"},{"message":"TEKST","id":"108013515952807_470178529736302","created_time":"2013-05-14T20:22:07+0000"}

我该如何解决这个问题?

6个回答

38

尽管你提供的JSON在问题中不完整,但异常提示表明你有多个顶层属性。你需要为它定义根元素以获取有效的XML:

var doc = JsonConvert.DeserializeXmlNode(jsonOutput, "root");

编辑:为了以缩进的方式打印出您的XML,您可以使用System.Xml.Linq命名空间下的XDocument类:XDocument.Parse(doc.InnerXml)


你有没有想过如何显示XML?我得到了这个System.Xml.XmlDocument :( - lukso
1
你可以使用 System.Xml.Linq 命名空间中的 XDocument 类来打印带有缩进的 XML:XDocument.Parse(doc.InnerXml) - jwaliszko

4
我认为值得链接到将xml转换为json和反向转换的文档
这些人是正确的。
// To convert an XML node contained in string xml into a JSON string   
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);

3

您也可以使用 .NET Framework (System.Runtime.Serialization.Json) 将 JSON 转换为 XML:

private static XDocument JsonToXml(string jsonString)
{
    using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(jsonString)))
    {
        var quotas = new XmlDictionaryReaderQuotas();
        return XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(stream, quotas));
    }
}

1
谢谢..:)。好答案。 - Vishal Sen
我的 XML 返回了一个类型。我该如何删除类型? 例如: <root type="object"> <ResponseHeader type="object"> <Success type="boolean">true</Success> - Kristina Lex
1
@KristinaLex 在这里查看评论 https://dev59.com/LXRA5IYBdhLWcg3wzhfZ#32412316 - Termininja

1

DeserializeXmlNode 返回 XDcument。如果需要,可以使用 FirstNode。

//string jsonOutput="{"id":"108013515952807","posts":{"data":[{"id":"108013515952807_470186843068804","created_time":"2013-05-14T20:43:28+0000"},{"message":"TEKST","id":"108013515952807_470178529736302","created_time":"2013-05-14T20:22:07+0000"}";
var myelement= JsonConvert.DeserializeXmlNode(jsonOutput, "myelement").FirstNode;

错误的方法。请使用DeserializeXNode(...)来处理XDocument。 - Fried

0

您分享的JSON无效,请先访问http://jsonformatter.curiousconcept.com/进行验证。

您的JSON应该如下所示:

{
   "id":"108013515952807",
   "posts":{
      "data":[
         {
            "id":"108013515952807_470186843068804",
            "created_time":"2013-05-14T20:43:28+0000"
         },
         {
            "message":"TEKST",
            "id":"108013515952807_470178529736302",
            "created_time":"2013-05-14T20:22:07+0000"
         }
      ]
   }
}

0
@jwaliszko的答案的基础上,补充一下,将JSON转换为XDocument
XDocument xml = JsonConvert.DeserializeXNode(json);

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