我正在try 使用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()

我的yields 正在下降:

{
    "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"
        ]
        }
    ]
}

我不知道如何在像预期输出一样的数组之前填充"Values"标签.

推荐答案

您可以将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()}]}]

EDIT

Now that I look at it again, the way you filter by !element."$it".children().size() may lead 至 unintended behaviour. I am not sure if that's what you really want. If you want all the leaves under Value you could try

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

Json相关问答推荐

JSON字符串处理注入引号

与错误相关的未定义&Quot;不是有效的JSON

错误:在 NX 工作区中找不到模块../swagger.json

Powershell ConvertFrom-Json 意外地从包含字符串的单个项目数组生成字符串而不是对象数组

如何将属性拆分为嵌套的JSON内容?

Rust实现:高效解析任意大小的JSON数组

使用本地 JSON api react TS Axios

jq - 将父键值提取为子元素旁边的逗号分隔值

使用 jq 将消息转换为数组

如何将该 JSON 解析为 Kotlin 类?

在 JOLT 中重新排列值

阅读 JSON 正文 Firebase 云函数

用powershell条件解析json文件的数组对象

ORA-01422: 精确提取返回的行数超过了与 json 对象组合的请求数

如何在循环中传递列表(会话(字符串属性))以在 Gatling Scala 中创建批量 Json 请求

使用 json 值过滤 Django 模型

SyntaxError:Object.parse(本机)AngularJS中的意外标记o

Jackson 的@JsonView、@JsonFilter 和 Spring

Spring Security 和 JSON 身份验证

Java循环遍历Json数组?