用于将json转换为CSV文件的Groovy代码

时间:2014-02-05 11:36:51

标签: groovy

有没有人有任何样本Groovy代码将JSON文档转换为CSV文件?我试图在Google上搜索但无济于事。

示例输入(来自评论):

[ company_id: '1',
  web_address: 'vodafone.com/',
  phone: '+44 11111',
  fax: '',
  email: '',
  addresses: [ 
      [ type: "office", 
        street_address: "Vodafone House, The Connection",
        zip_code: "RG14 2FN",
        geo: [ lat: 51.4145, lng: 1.318385 ] ]
  ],
  number_of_employees: 91272,
  naics: [
      primary: [ 
          "517210": "Wireless Telecommunications Carriers (except Satellite)" ],
      secondary: [ 
          "517110": "Wired Telecommunications Carriers",
          "517919": "Internet Service Providers",
          "518210": "Web Hosting"
      ]
  ]

来自编辑的更多信息:

def export(){
   def exportCsv = [ [ id:'1', color:'red', planet:'mars', description:'Mars, the "red" planet'], 
                     [ id:'2', color:'green', planet:'neptune', description:'Neptune, the "green" planet'],
                     [ id:'3', color:'blue', planet:'earth', description:'Earth, the "blue" planet'],
                   ]
    def out = new File('/home/mandeep/groovy/workspace/FirstGroovyProject/src/test.csv') 
    exportCsv.each {
        def row = [it.id, it.color, it.planet,it.description]
        out.append row.join(',')
        out.append '\n'
    }
    return out
}

1 个答案:

答案 0 :(得分:5)

好的,这是怎么回事:

import groovy.json.*

// Added extra fields and types for testing    
def js = '''{"infile": [{"field1": 11,"field2": 12,                 "field3": 13},
                        {"field1": 21,             "field4": "dave","field3": 23},
                        {"field1": 31,"field2": 32,                 "field3": 33}]}'''


def data = new JsonSlurper().parseText( js ) 
def columns = data.infile*.keySet().flatten().unique()

// Wrap strings in double quotes, and remove nulls
def encode = { e -> e == null ? '' : e instanceof String ? /"$e"/ : "$e" }

// Print all the column names
println columns.collect { c -> encode( c ) }.join( ',' )

// Then create all the rows
println data.infile.collect { row ->
    // A row at a time
    columns.collect { colName -> encode( row[ colName ] ) }.join( ',' )
}.join( '\n' )

打印:

"field3","field2","field1","field4"
13,12,11,
23,,21,"dave"
33,32,31,

哪个看起来对我不对