使用Newtonsoft.Json将XML转换为JSON数组

时间:2017-02-17 16:42:23

标签: json json.net

我有以下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"
        }
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:3)

json:Array='true'无法在这种情况下为您提供所需的结果。此属性旨在表示您希望将特定XML元素在仅存在其中一个的情况下转换为JSON时将其视为数组。如果存在多个特定XML元素,则它们将自动被视为数组。因此,在您的情况下,多个Encounter元素将成为单个Encounters对象内的数组。看起来你真的想把它压平一层。 Json.Net无法使用XML中的属性来实现此目的。因此,有三种可能的方法可以解决这个问题:

  1. 在将XML转换为JSON之前操作XML
  2. 从XML转换后操作JSON
  3. 编写自定义XML-to-JSON转换器以执行您想要的操作。
  4. 我认为方法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