【问题标题】:Best way to convert XML and flatten to JSON将 XML 转换为 JSON 并展平的最佳方法
【发布时间】:2016-10-31 19:24:09
【问题描述】:

我有一个格式如下的 XML 文件:

<root>
    <foos>
        <foo>
            <id>1</id>
            <number>1245</number>
        </foo>
        <foo>
            <id>2</id>
            <number>6743</number>
        </foo>
        <foo>
            <id>3</id>
            <number>2245</number>
        </foo>
    </foos>
    <bars>
        <bar>
            <id>4</id>
            <number>123</number>
        </bar>
        <bar>
            <id>5</id>
            <number>321</number>
        </bar>
    </bars>
</root>

请注意,foosbars 等节点的数量很大。 我想将此结构解析为以下格式的 JSON:

{
    foos: [
        {
            id: 1,
            number: 1245
        },
        {
            id: 2,
            number: 6743
        },
        {
            id: 3,
            number: 2245
        }
    ],
    bars: [
        {
            id: 4,
            number: 123
        },
        {
            id: 5,
            number: 321
        }
    ]
}

我已经尝试使用NewtonSoft.Json 来实现这一点,它工作正常,除了节点没有按照我的意愿展平,我最终得到以下 JSON:

{
    foos: { foo: [
        {
            id: 1,
            number: 1245
        },
        {
            id: 2,
            number: 6743
        },
        {
            id: 3,
            number: 2245
        } }
    ],
    bars: { bar: [
        {
            id: 4,
            number: 123
        },
        {
            id: 5,
            number: 321
        } }
    ]
}

关于如何在不必遍历所有节点(如 foosbars 并手动展平它)的情况下实现该结构的任何提示?

【问题讨论】:

  • 如果“……工作正常,除了……”,它实际上工作正常。
  • 它甚至不是你想要得到的有效 json
  • 我已经尝试使用 NewtonSoft.Json 来实现这一点,并且效果很好 -- 你能分享一下你到目前为止所做的尝试吗?
  • @Tinwor 它无效的唯一原因是键不在引号之间。是这样吗?你什么意思?

标签: c# json xml xml-deserialization


【解决方案1】:

您可以使用 Json.Net 的 LINQ-to-JSON API (JObjects) 从 XML 构建 JSON:

var root = XElement.Parse(xml);
var json = new JObject(
    root.Elements().Select(x =>
        new JProperty(x.Name.ToString(),
            new JArray(
                x.Elements().Select(y =>
                    new JObject(
                        y.Elements().Select(z =>
                            new JProperty(z.Name.ToString(),
                                new JValue(int.Parse(z.Value))
                            )
                        )
                    )
                )
            )
        )
    )
).ToString();

演示小提琴:https://dotnetfiddle.net/jPjnuY

【讨论】:

  • 问题不是所有节点都像foos和bars,有些已经是扁平的。但这是你给我的一个很好的方向。将尝试解决它,谢谢!
猜你喜欢
  • 2012-01-10
  • 2021-10-16
  • 2011-10-08
  • 1970-01-01
  • 2011-02-11
  • 2021-08-24
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多