使用 Groovy 将 XML 转换为 JSON

问题描述 投票:0回答:1

我正在尝试使用 SAP CPI 中的 Groovy 将 XML 转换为所需的 JSON。使用 SAP CPI 提供的标准 XML 到 JSON 转换器,我没有得到想要的结果。我在下面写了 groovy 代码,它给了我想要的 JSON,除了数组名称。

def xml = """<Rows>
    <Values>
    <Value>
        <Name>DummyTest_1</Name>
        <Site.Value>3</Site.Value>
        <Description>Dummy PN For Test 1</Description>
        <Type.Value>N</Type.Value>
        <BuyerCode.Value/>,
      <PlannerCode.Value/>,
      <PlannerCode.Description/>,
      <ABCCode.Value>Default</ABCCode.Value>
        <UnitOfMeasure.Value>LB</UnitOfMeasure.Value>
        <SafetyStockQty>1</SafetyStockQty>
        <StdUnitCost>10</StdUnitCost>
        <AverageSellingPrice>15</AverageSellingPrice>
        <ProductFamily.Value/>
        <ProductGroup1>CHC</ProductGroup1>
        <IncrementalRule.Value>Default</IncrementalRule.Value>
        <MUEPoolNettingType.Value>Ignore</MUEPoolNettingType.Value>
        <PlanningCalendars.Value>Default</PlanningCalendars.Value>
        <SourceRule.Value>Default</SourceRule.Value>
    </Value>
    <Value>
        <Name>DummyTest_2</Name>
        <Site.Value>4</Site.Value>
        <Description>Dummy PN For Test 2</Description>
        <Type.Value>H</Type.Value>
        <BuyerCode.Value/>,
      <PlannerCode.Value/>,
      <PlannerCode.Description/>,
      <ABCCode.Value>Default2</ABCCode.Value>
        <UnitOfMeasure.Value>BL</UnitOfMeasure.Value>
        <SafetyStockQty>2</SafetyStockQty>
        <StdUnitCost>20</StdUnitCost>
        <AverageSellingPrice>16</AverageSellingPrice>
        <ProductFamily.Value/>
        <ProductGroup1>CHC</ProductGroup1>
        <IncrementalRule.Value>Default</IncrementalRule.Value>
        <MUEPoolNettingType.Value>Ignore</MUEPoolNettingType.Value>
        <PlanningCalendars.Value>Default</PlanningCalendars.Value>
        <SourceRule.Value>Default</SourceRule.Value>
    </Value>
    </Values>
</Rows>"""

def parsed = new XmlSlurper().parseText(xml)

def values = ['Rows' :  parsed.'**'.findAll{it.name() == 'Value'}.collect{element -> element.children().breadthFirst()*.name().findAll { !element."$it".children().size() }.collect{element."$it".text()}}]
def fields = ['Fields' :  parsed.'**'.find{it.name() == 'Value'}.collect{element -> element.children().breadthFirst()*.name()
             .findAll { !element."$it".children().size() }
           .collect{element."$it".name()}}]

fields += values
println new groovy.json.JsonBuilder(fields).toPrettyString()

我的输出低于:

{
    "Fields": [
        [
            "Name",
            "Site.Value",
            "Description",
            "Type.Value",
            "BuyerCode.Value",
            "PlannerCode.Value",
            "PlannerCode.Description",
            "ABCCode.Value",
            "UnitOfMeasure.Value",
            "SafetyStockQty",
            "StdUnitCost",
            "AverageSellingPrice",
            "ProductFamily.Value",
            "ProductGroup1",
            "IncrementalRule.Value",
            "MUEPoolNettingType.Value",
            "PlanningCalendars.Value",
            "SourceRule.Value"
        ]
    ],
    "Rows": [
        [
            "DummyTest_1",
            "3",
            "Dummy PN For Test 1",
            "N",
            "",
            "",
            "",
            "Default",
            "LB",
            "1",
            "10",
            "15",
            "",
            "CHC",
            "Default",
            "Ignore",
            "Default",
            "Default"
        ],
        [
            "DummyTest_2",
            "4",
            "Dummy PN For Test 2",
            "H",
            "",
            "",
            "",
            "Default2",
            "BL",
            "2",
            "20",
            "16",
            "",
            "CHC",
            "Default",
            "Ignore",
            "Default",
            "Default"
        ]
    ]
}

但是预期的输出是:

{
    "Fields": [
        [
            "Name",
            "Site.Value",
            "Description",
            "Type.Value",
            "BuyerCode.Value",
            "PlannerCode.Value",
            "PlannerCode.Description",
            "ABCCode.Value",
            "UnitOfMeasure.Value",
            "SafetyStockQty",
            "StdUnitCost",
            "AverageSellingPrice",
            "ProductFamily.Value",
            "ProductGroup1",
            "IncrementalRule.Value",
            "MUEPoolNettingType.Value",
            "PlanningCalendars.Value",
            "SourceRule.Value"
        ]
    ],
    "Rows": [
     {
        "Value":[
            "DummyTest_1",
            "3",
            "Dummy PN For Test 1",
            "N",
            "",
            "",
            "",
            "Default",
            "LB",
            "1",
            "10",
            "15",
            "",
            "CHC",
            "Default",
            "Ignore",
            "Default",
            "Default"
        ]
        },
        {
          "Value":[
            "DummyTest_2",
            "4",
            "Dummy PN For Test 2",
            "H",
            "",
            "",
            "",
            "Default2",
            "BL",
            "2",
            "20",
            "16",
            "",
            "CHC",
            "Default",
            "Ignore",
            "Default",
            "Default"
        ]
        }
    ]
}

我不知道如何像预期输出一样在数组之前填充“值”标签。

json xml groovy sap
1个回答
1
投票

您可以将

values
中的元素转换为以
Value
为键的地图。换线试试

def values = ['Rows' :  parsed.'**'.findAll{it.name() == 'Value'}.collect{element -> element.children().breadthFirst()*.name().findAll { !element."$it".children().size() }.collect{element."$it".text()}}]

def values = ['Rows' :  parsed.'**'.findAll{it.name() == 'Value'}.collect{element -> [Value: element.children().breadthFirst()*.name().findAll { !element."$it".children().size() }.collect{element."$it".text()}]}]
© www.soinside.com 2019 - 2024. All rights reserved.