在这里寻求帮助。我有一种情况,我们是从Web服务调用中获取这种XML的。
<root type="object">
<dealId>2959</dealId>
<dealDetailId>2</dealDetailId>
<localeId>1542</localeId>
</root>
这是我要使用的代码。
public class Info
{
public string @type { get; set; }
public string dealId { get; set; }
public string dealDetailId { get; set; }
public string localeId { get; set; }
}
[TestMethod]
public void TestXMLToJson()
{
string xml = @"<root type=""object"">
<dealId>2959</dealId>
<dealDetailId>2</dealDetailId>
<localeId>1542</localeId>
</root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
Info deal = JsonConvert.DeserializeObject<Info>(jsonText);
}
运行此命令并查看jsonText时,将得到以下结果:
{"root":"@type":"object","dealId":"2959","dealDetailId":"2","localeId":"1542"}}
在Json Viewer中看起来像这样:
{
"root": {
"@type": "object",
"dealId": "2959",
"dealDetailId": "2",
"localeId": "1542"
}
}
我希望我只是做一些愚蠢的事情,您能提供的任何帮助都会很棒。
答案 0 :(得分:0)
要在没有root
对象包装器的情况下将XML转换为JSON,您需要为SerializeXmlNode
方法的true
参数传递omitRootObject
。更改此行:
string jsonText = JsonConvert.SerializeXmlNode(doc);
对此:
string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
这将从XML中生成以下JSON:
{"@type":"object","dealId":"2959","dealDetailId":"2","localeId":"1542"}
您可能还需要在模型的[JsonProperty]
属性上使用@type
属性,以使其清晰地反序列化。没有那个,我无法使其工作。我还是建议这样做,以便您可以遵循常规的C#命名约定,而不必在代码中都使用丑陋的@
:
public class Info
{
[JsonProperty("@type")]
public string Type { get; set; }
[JsonProperty("dealId")]
public string DealId { get; set; }
[JsonProperty("dealDetailId")]
public string DealDetailId { get; set; }
[JsonProperty("localeId")]
public string LocaleId { get; set; }
}
正在运行的演示:https://dotnetfiddle.net/sJpKl3
所有这些,如果您的最终目标是将XML反序列化为模型,那么为什么仍要转换为JSON?您可以使用XmlSerializer
直接进行操作。
首先,像这样标记您的模型:
[XmlRoot("root")]
public class Info
{
[XmlAttribute("type")]
public string Type { get; set; }
[XmlElement("dealId")]
public string DealId { get; set; }
[XmlElement("dealDetailId")]
public string DealDetailId { get; set; }
[XmlElement("localeId")]
public string LocaleId { get; set; }
}
然后,像这样反序列化:
string xml =
@"<root type=""object"">
<dealId>2959</dealId>
<dealDetailId>2</dealDetailId>
<localeId>1542</localeId>
</root>";
StringReader reader = new StringReader(xml);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Info));
Info info = (Info)xmlSerializer.Deserialize(reader);