3

我有选择数据的查询:

Public Function GetStaffList(StaffCode As String) As IEnumerable
   Dim query = (From c In Staff Where c.StaffID= StaffCode Select c)
   Return query
End Function

之后我使用下面的代码返回 Json:

Public Function GetPersonListJson(PersonCode As String) As String 
   Return JsonConvert.SerializeObject(GetStaffList(StaffCode))
End Function

Json 格式如下:

"[{\"$id\":\"1\",\"PersonID\":10001.0,\"PersonName\":\"Staff1\"}]"

如果我想以 XML 格式返回,我该怎么做?谢谢

更新:我尝试使用以下代码返回 xml

   Public Function GetPersonListJson(PersonCode As String) As String 
       Dim json = JsonConvert.SerializeObject(GetStaffList(StaffCode))
       Dim rootJson = "{""root"":" & json & "}"
       Dim xml = JsonConvert.DeserializeXNode(rootJson)
       Return xml.ToString()
    End Function

调试时xml的值为:

<root xmlns:json="http://james.newtonking.com/projects/json" json:id="1"><PersonID>10001</PersonID><PersonName>Staff1</PersonName> <EntityKey json:id="2"><EntitySetName>tblPerson</EntitySetName><EntityContainerName>PersonEntities</EntityContainerName><EntityKeyValues><Key>PersonID</Key><Type>System.Decimal</Type><Value>10001</Value></EntityKeyValues></EntityKey></root>

添加 .ToString() 后,返回结果如下:

"\u000d\u000a \u000d\u000a 10001<\/PersonID>\u000d\u000a Staff1<\/PersonName>\u000d\u000a \u000d\u000a 

但这不是 xml 格式。请再帮忙。谢谢

4

3 回答 3

3

你可以使用DeserializeXNode方法。根据您的 JSON,您可能需要为 XML 元素指定根元素名称。下面我使用“Staff”作为根名称。

Dim xml = JsonConvert.DeserializeXNode(json, "Staff")

上面返回一个XDocument. 要将 XML 作为字符串返回,请.ToString()在其末尾添加。根据您的评论,听起来您正在尝试将此代码添加到现有GetPersonListJson方法中。因此,您可以在上述行之后添加这一行:

Return xml.ToString()

也就是说,您的方法名称不再与您实际所做的匹配。它已命名GetPersonListJson,但现在您将 XML 作为字符串返回,而不是 JSON。为了清楚起见,我建议重命名它。

更新:您的示例字符串是一个 json 数组,这就是上面给您XmlNodeConverter can only convert JSON that begins with an object错误的原因。要解决此问题,您需要手动将根元素添加到 JSON:

Public Function GetPersonListJson(PersonCode As String) As String 
   Dim json = JsonConvert.SerializeObject(GetStaffList(StaffCode))

   ' this step adds a root to the json (you can rename "root" to anything)'
   Dim rootJson = "{""root"":" & json & "}"

   Dim xml = JsonConvert.DeserializeXNode(rootJson)
   Return xml.ToString()
End Function
于 2013-09-24T15:53:47.560 回答
0

我发现这个工作:

    string xml = "";
    string json = @"{
                    '?xml': {
                      '@version': '1.0',
                      '@standalone': 'no'
                    },
                    'root': {
                    'object': " + JsonConvert.SerializeObject(object, Formatting.None)
                    + "}}";
    var xd = JsonConvert.DeserializeXmlNode(json);
    using (var sw = new StringWriter()) {
      using (var xw = System.Xml.XmlWriter.Create(sw)) {
        xd.WriteTo(xw);
        xw.Flush();
        xml = sw.GetStringBuilder().ToString();
      }
    }

归功于此页面:http: //james.newtonking.com/json/help/html/ConvertingJSONandXML.htm

于 2014-04-18T07:11:17.867 回答
0

您在使用 DeserializeXmlNode 时可能遇到的问题是它将长小数转换为科学记数法

例如:

{
  "imp_currency_exchange": [{
      "base_currency_code": "USD",
      "exchange_currency_code": "IDR",
      "exchange_date": "2022-02-01T16:06:50Z",
      "exchange_rate": 14205,
      "batch_id": "FXR-20220201_3",
      "reverse_exchange_rate": 0.0000703977
    }
  ]
}

转换为

<root>
  <imp_currency_exchange>
    <base_currency_code>USD</base_currency_code>
    <exchange_currency_code>IDR</exchange_currency_code>
    <exchange_date>2022-02-01T16:06:50Z</exchange_date>
    <exchange_rate>14205</exchange_rate>
    <batch_id>FXR-20220201_4</batch_id>
    <reverse_exchange_rate>7.03977E-05</reverse_exchange_rate>
  </imp_currency_exchange>
</root>

这有点问题(至少对我来说)。没有允许您传递设置的 DeserializeXNode,因此您必须深入研究源代码以查看 DeserializeXNode 正在做什么,然后做得更好。

https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/JsonConvert.cs

像这样:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.FloatParseHandling = FloatParseHandling.Decimal;

XmlNodeConverter xmlConverter = new XmlNodeConverter();
xmlConverter.DeserializeRootElementName = "root";
xmlConverter.WriteArrayAttribute = false;
xmlConverter.EncodeSpecialCharacters = false;
settings.Converters.Add(xmlConverter);

string myXML = (XDocument)Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(XDocument), settings).ToString();

希望这对某人有所帮助,我花了几个小时来挖掘并弄清楚这一点。

哦,对不起,如果代码实际上不起作用,我在 VB 中工作并为你们转换了它,所以没有冷落的鼻子,我不想测试它:)

于 2022-02-02T17:52:32.250 回答