转换XML并展平为JSON的最佳方法

时间:2016-10-31 19:24:10

标签: c# json xml xml-deserialization

我有一个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等所有节点并手动展平它们?

1 个答案:

答案 0 :(得分: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