从JSON获取Groovy输出XML

从JSON获取Groovy输出XML,groovy,xmlserializer,jsonslurper,Groovy,Xmlserializer,Jsonslurper,我正在努力让groovy脚本输出符合供应商规范的所需内容。最终,我将使用一个文件而不是静态行填充JsonSlurper,但为了简单起见,我提供了示例JSON。在GroovyConsole中运行以下代码时,我似乎无法确定UserReference和Bal节点包含我指定的名称空间的原因。感谢您的帮助 import groovy.xml.* import groovy.json.JsonSlurper def queryResultsResponseString =

我正在努力让groovy脚本输出符合供应商规范的所需内容。最终,我将使用一个文件而不是静态行填充JsonSlurper,但为了简单起见,我提供了示例JSON。在GroovyConsole中运行以下代码时,我似乎无法确定UserReference和Bal节点包含我指定的名称空间的原因。感谢您的帮助

    import groovy.xml.* 
    import groovy.json.JsonSlurper  
    def queryResultsResponseString =  
    ''' 
    { 
    "rows": [ 
    { 

                     "account_num": 123, 
                     "name": "Mr Bigbucks", 
                     "balance": 83.23 
                   }, 
                   { 
                     "account_num": 8675309, 
                     "name": "Johnny", 
                     "balance": 45.75 
                   } 
                  ] 
       } 
     ''' 
     def jsonResp = (new JsonSlurper()).parseText(queryResultsResponseString); 
     def xml = new groovy.xml.StreamingMarkupBuilder()
     xml.encoding = "UTF-8"
     def prints = xml.bind{ 
        mkp.xmlDeclaration()  
      mkp.declareNamespace(p1 :"com/my/namespace/woot" + "\"" + " " + "xsi:schemaLocation=\"http://www.w3.org/2001/XMLSchema-instance") 

      'p1:BatchEidvPersonSearch' { 
       jsonResp.rows.each{row -> 
         EidvPersonSearchRequest { 
           InternalId('Internal Id')
           UserReference('CLEAR ID Confirm Person Search')
           criteria {
           acctNum row.account_num 
           custName row.name 
           bal row.balance 
           }
         } 
       } 
     } 
     }
    println XmlUtil.serialize(prints).replaceAll('"','"')
// ---Results Here ---
    <?xml version="1.0" encoding="UTF-8"?><p1:BatchEidvPersonSearch xmlns:p1="com/my/namespace/woot" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">
      <EidvPersonSearchRequest>
        <InternalId>Internal Id</InternalId>
        <UserReference xmlns:p1="com/my/namespace/woot" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">CLEAR ID Confirm Person Search</UserReference>
        <criteria>
          <acctNum>123</acctNum>
          <custName>Mr Bigbucks</custName>
          <bal xmlns:p1="com/my/namespace/woot" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">83.23</bal>
        </criteria>
      </EidvPersonSearchRequest>
      <EidvPersonSearchRequest>
        <InternalId>Internal Id</InternalId>
        <UserReference xmlns:p1="com/my/namespace/woot" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">CLEAR ID Confirm Person Search</UserReference>
        <criteria>
          <acctNum>8675309</acctNum>
          <custName>Johnny</custName>
          <bal xmlns:p1="com/my/namespace/woot" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">45.75</bal>
        </criteria>
      </EidvPersonSearchRequest>
    </p1:BatchEidvPersonSearch>
import groovy.xml.*
导入groovy.json.JsonSlurper
def queryResultsResponseString=
''' 
{ 
“行”:[
{ 
“账号”:123,
“姓名”:“Bigbucks先生”,
“余额”:83.23
}, 
{ 
“账号”:8675309,
“姓名”:“约翰尼”,
“余额”:45.75
} 
] 
} 
''' 
def jsonResp=(新的JsonSlurper()).parseText(queryResultsResponseString);
def xml=new groovy.xml.StreamingMarkupBuilder()
xml.encoding=“UTF-8”
def prints=xml.bind{
mkp.xml声明()
mkp.declareNamespace(p1:“com/my/namespace/woot”+“\+”+“+”+“xsi:schemaLocation=\”http://www.w3.org/2001/XMLSchema-instance") 
'p1:BatchEidvPersonSearch'{
jsonResp.rows.each{row->
EidvPersonSearchRequest{
内部Id(“内部Id”)
UserReference('CLEAR ID Confirm Person Search')
标准{
账户行。账户号
custName row.name
平衡行
}
} 
} 
} 
}
println XmlUtil.serialize(prints).replaceAll(“,”)
//---这里是结果---
内部Id
清除ID确认人员搜索
123
比格巴克先生
83.23
内部Id
清除ID确认人员搜索
8675309
约翰尼
45.75
---更新-----


我试图通过本地加载的2.2 Groovy Jar附带的ETL工具调用此Groovy脚本,并注意到通过ETL工具调用脚本时,它会生成我期望的输出。所以…我从归档文件中下载了2.2 groovy,并使用groovy控制台调用我的脚本,然后BAM它就可以工作了。我不确定版本之间发生了什么变化,但输出肯定有变化。我怀疑当我们升级ETL工具时,JAR将被更新为最新的est版本。您知道这两个版本之间有什么显著的不同吗?

当我完全按照上提供的方式运行代码时,我得到的是预期的结果,而不是您看到的结果。您使用的是什么版本的groovy,您的问题中是否有其他未显示的自定义项?有趣的是,我使用该站点开始开发,它输出了我所期望的结果。我正在使用Groovy 2.5.6。关于“额外定制”的问题,我不这么认为,但你具体在问什么?注册定制序列化程序或通过其他复杂的方式额外定制输出是可能的。如果你这样做,你可能知道。否则,我所能想到的就是,可能您的作用域中还有其他一些
对象,因此序列化程序正在添加名称空间,以澄清它的含义。您还可以尝试在.each闭包中的bal和UserReference周围加引号;我偶尔会看到一些奇怪的行为,当你使用一个已经存在于作用域中的键作为变量名时(这里看起来不像,但可能在你的完整代码中?),当我完全按照上提供的方式运行你的代码时,我得到了预期的结果,而不是你看到的结果。您使用的是什么版本的groovy,您的问题中是否有其他未显示的自定义项?有趣的是,我使用该站点开始开发,它输出了我所期望的结果。我正在使用Groovy 2.5.6。关于“额外定制”的问题,我不这么认为,但你具体在问什么?注册定制序列化程序或通过其他复杂的方式额外定制输出是可能的。如果你这样做,你可能知道。否则,我所能想到的就是,可能您的作用域中还有其他一些
对象,因此序列化程序正在添加名称空间,以澄清它的含义。您还可以尝试在.each闭包中的bal和UserReference周围加引号;当您使用范围中已经存在的键作为变量名时,我偶尔会看到一些奇怪的行为(这里看起来不像,但可能在您的完整代码中?)