使用newtonsoft.json将XML转换为JSON数组



i具有以下XML,我需要转换为下面显示的JSON。我正在使用newtonsoft.json,找不到配置和json:Array属性的正确组合来获得我的需求。我还有其他属性吗?我需要写一个自定义转换器吗?

这是我的XML:

<Container>
  <Encounters>
    <Encounter>
      <a>a1</a>
      <b>b1</b>
    </Encounter>
    <Encounter>
      <a>a2</a>
      <b>b2</b>
    </Encounter>
  </Encounters>
</Container>

这是我需要的JSON:

{
  "Container": {
    "Encounters" : [
      {
        "a": "a1",
        "b": "b1"
      },
      {
        "a": "a2",
        "b": "b2"
      }
    ]
  }
}

这是我目前正在得到的JSON:

{
  "Container": {
    "Encounters" : {
      "Encounter" : [
        {
          "a": "a1",
          "b": "b1"
        },
        {
          "a": "a2",
          "b": "b2"
        }
      ]
    }
  }
}

json:Array='true'不会在这种情况下给您带来所需的结果。此属性旨在信号表明您希望特定的XML元素被视为数组,而当它只有一个,将其转换为JSON。如果特定XML元素的倍数,它们将自动将其视为数组。因此,在您的情况下,多个Encounter元素将成为单个Encounters对象中的数组。看来您实际上想将这个级别降低。JSON.NET无法使用XML中的属性来执行此操作。因此,我可以看到三种可能的方法来解决这个问题:

  1. 在将XML转换为JSON之前,请操纵XML
  2. 从XML转换后操纵JSON
  3. 写一个自定义的xml-to-json转换器来完成您想要的事情。

我认为方法2使用Linq-to-json API(jobjects)可能是最容易的:

string xml =
@"<Container>
  <Encounters>
    <Encounter>
      <a>a1</a>
      <b>b1</b>
    </Encounter>
    <Encounter>
      <a>a2</a>
      <b>b2</b>
    </Encounter>
  </Encounters>
</Container>";
// Convert XML to a JObject
JObject root = JObject.Parse(JsonConvert.SerializeXNode(XElement.Parse(xml)));
// Move the array of Encounter objects up one level
JProperty encounters = ((JObject)root["Container"]).Property("Encounters");
encounters.Value = encounters.Value["Encounter"];
// Output the JSON
string json = root.ToString();
Console.WriteLine(json);

输出:

{
  "Container": {
    "Encounters": [
      {
        "a": "a1",
        "b": "b1"
      },
      {
        "a": "a2",
        "b": "b2"
      }
    ]
  }
}

小提琴:https://dotnetfiddle.net/kk1exr

相关内容

  • 没有找到相关文章

最新更新