【问题标题】:Unable to iterate JSON map using Groovy on Mule payload无法在 Mule 有效负载上使用 Groovy 迭代 JSON 映射
【发布时间】:2015-04-21 19:04:34
【问题描述】:

我无法在我的 Groovy 脚本中迭代 JSON(映射),这是我的问题的详细信息。

在 Mule 中,我收到一个 JSON。这里是:

{
    "order": {
        "ContactId": "112",
        "Discount": "0.000000",
        "OrderDate": "2015-03-26 15:26:38",
        "OrderNumber": "VBOKLZZZF",
        "Total": "43.810000",
        "NumberOfChild": "2",
        "PaymentMethod": 1,
        "SpouseName": "Firstname Lastname",
        "Products": [
            {
                "Product": {
                    "Quantity": "1",
                    "UnitPrice": null,
                    "Code": "AB20"
                }
            },
          {
                "Product": {
                    "Quantity": "1",
                    "UnitPrice": null,
                    "Code": "AB20"
                }
            }
        ]
    }
}

我想使用 Groovy 的 MarkupBuilder 转换为 XML。这是我正在寻找的输出:

<SaveOrder xmlns='http://tempuri.org/'>
  <order xmlns='http://schemas.datacontract.org/2004/07/Service.Entities'>
    <ContactId>112</ContactId>
    <Discount>0.000000</Discount>
    <OrderDate>2015-03-26 15:26:38</OrderDate>
    <OrderNumber>VBOKLZZZF</OrderNumber>
    <Total>43.810000</Total>
    <NumberOfChild>2</NumberOfChild>
    <PaymentMethod>1</PaymentMethod>
    <SpouseName>FirstName Lastname</SpouseName>
    <Products xmlns:"http://schemas.datacontract.org/2004/07/Service.Entities">
      <ns1:Product>
        <ns1:Code>AB20</ns1:Code>
        <ns1:Quantity>1</ns1:Quantity>
      </ns1:Product>
      <ns1:Product>
        <ns1:Code>AB20</ns1:Code>
        <ns1:Quantity>1</ns1:Quantity>
      </ns1:Product>
    </ns1:Products>
  </order>
</SaveOrder>

在 Mule 中,我接收 JSON 并使用返回类 java.util.Map 对 Object 执行 JSON。

这是我的 Groovy 脚本代码。

def writer = new StringWriter() 
        def xml = new groovy.xml.MarkupBuilder(writer)
        xml.SaveOrder(xmlns: 'http://tempuri.org/') {
          xml.order(xmlns: 'http://schemas.datacontract.org/2004/07/Service.Entities'){
            ContactId(payload.order.ContactId)
            Discount(payload.order.Discount)
            OrderDate(payload.order.OrderDate)
            OrderNumber(payload.order.OrderNumber)
            Total(payload.order.Total)
            NumberOfChild(payload.order.NumberOfChild)
            PaymentMethod(payload.order.PaymentMethod)
            SpouseName(payload.order.SpouseName)
            xml.Products(){
                for(Product in payload.Products){
                        xml.Product(){
                            Quantity(Product.Quantity)
                            UnitPrice(Product.UnitPrice)
                            Code(Product.Code)
                        }

                }
            }
          }
        } 
        result = writer.toString() 

但我只能得到这个

<SaveOrder xmlns='http://tempuri.org/'>
  <order xmlns='http://schemas.datacontract.org/2004/07/Service.Entities'>
    <ContactId>112</ContactPrestashopId>
    <Discount>0.000000</Discount>
    <OrderDate>2015-03-26 15:26:38</OrderDate>
    <OrderNumber>VBOKLZZZF</OrderNumber>
    <Total>43.810000</Total>
    <NumberOfChild>2</NumberOfChild>
    <PaymentMethod>1</PaymentMethod>
    <SpouseName>Firstname Lastname</SpouseName>
    <Products />
  </order>
</SaveOrder>

有人可以帮助我在 Groovy 脚本中进行迭代吗?

感谢您的帮助

【问题讨论】:

    标签: xml json groovy mule markupbuilder


    【解决方案1】:

    您没有正确访问产品,它是payload.order.Products

    def xml = new StringWriter().with { w ->
        new MarkupBuilder(w).with {
            SaveOrder(xmlns: 'http://tempuri.org/') {
                order(xmlns: 'http://schemas.datacontract.org/2004/07/Service.Entities') {
                    ContactId(payload.order.ContactId)
                    Discount(payload.order.Discount)
                    OrderDate(payload.order.OrderDate)
                    OrderNumber(payload.order.OrderNumber)
                    Total(payload.order.Total)
                    NumberOfChild(payload.order.NumberOfChild)
                    PaymentMethod(payload.order.PaymentMethod)
                    SpouseName(payload.order.SpouseName)
                    Products(xmlns:"http://schemas.datacontract.org/2004/07/Service.Entities") {
                        payload.order.Products.each { p ->
                            'ns1:Product' {
                                'ns1:Code'(p.Product.Code)
                                'ns1:Quantity'(p.Product.Quantity)
                            }
                        }
                    }
                }
            }
        }
        w.toString()
    }
    

    【讨论】:

    • 您好,感谢您的回答。使用.with { w -&gt;payload.order.Products.each { p -&gt; 是不是比仅仅使用'for(Product in payload.order.Products)' 更好,还是本质上是一样的?
    • with 使您免于在变量中声明作者。 each 在此上下文中与 for 基本相同
    • 我明白了。谢谢@tim_yates 的回答。
    【解决方案2】:

    根据您的 JSON 结构,它应该是:

    xml.Products(){
                    for(Product in payload.order.Products){
                            xml.Product(){
                                Quantity(Product.Product.Quantity)
                                UnitPrice(Product.Product.UnitPrice)
                                Code(Product.Product.Code)
                            }
    
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2014-02-12
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多