2016-10-28 3 views
0

Я пытаюсь динамически строить некоторые json на основе данных, которые я извлекаю из базы данных. До открытия «[» - это «корень», я думаю, вы могли бы сказать. Следующие части с именем и значением являются динамическими и будут основываться на количестве результатов, которые я получаю от db. Я запрашиваю db, и тогда идея состояла в том, чтобы повторить результат, добавив json. Могу ли я использовать jsonBuilder для корневого раздела, а затем цикл с jsonSlurper, чтобы добавить каждый дополнительный раздел? Большинство примеров, которые я видел, касаются корня, а затем однократного «slurp», а затем соединения двух, поэтому не было уверенности в том, что я должен попробовать другой метод для циклирования и добавления нескольких разделов.Динамически строить json используя groovy

Любые советы были бы весьма признательны. Благодарю.

{ 
     "hostname": "$hostname", 
     "path": "$path", 
     "extPath": "$extPath", 
     "appName": "$appName", 
     "update": {"parameter": [ 
       { 
      "name": "$name", 
      "value": "$value" 
      }, 
       { 
      "name": "$name", 
      "value": "$value" 
      } 
     ]} 
    } 

EDIT: Так что я в конечном итоге делает только с помощью StringBuilder для создания начального блока, а затем добавить последующие разделы. Возможно, это не самый изящный способ сделать это, но он работает!

//Create the json string 
    StringBuilder json = new StringBuilder("""{ 
     "hostname": "$hostname", 
     "path": "$path", 
     "extPath": "$extPath", 
     "appName": "$appName", 
     "update": {"parameter": [""" 
    ) 


    //Append 
    sql.eachRow("""<query>""", 
    { params -> 
    json.append("""{ "name": "params.name", "value": "params.value" },"""); 
    } 
    ) 

    //Add closing json tags 
    json.append("""]}}""") 

ответ

1

Если я получил ваше объяснение правильно, и если данные не очень большой (он может жить в памяти), я бы построить Map объект (который очень легко работать в заводной) и преобразовать его к JSON впоследствии. Что-то вроде этого:

def data = [ 
    hostname: hostname, 
    path: path, 
    extPath: extPath, 
    appName: appName, 
    update: [parameter: []] 
] 

sql.eachRow(sqlStr) { row -> 
    data.update.parameter << [name: row.name, value: row.value] 
} 

println JsonOutput.toJson(data) 
+0

Спасибо за предложение. – ssbsts

+0

Если бы это помогло, не могли бы вы принять ответ? – sensei

0

Если вы используете Grails и Groovy вы можете использовать grails.converters.JSON.

Во-первых, определить JSON с именем конфигурации:

JSON.createNamedConfig('person') { 
    it.registerObjectMarshaller(Person) { 
     Person person -> 
     def output = [:] 
     output['name'] = person.name 
     output['address'] = person.address 
     output['age'] = person.age 
     output 
    } 
} 

Это приведет к статически определенным именем конфигурации для типа объекта личности. Теперь, вы можете просто позвонить:

JSON.use('person') { 
    Person.findAll() as JSON 
} 

Это будет возвращать каждый человек в базе данных с их имя, адрес и возраст всех в одном запросе JSON. Я не знаю, используете ли вы также грабли в этой ситуации, но для чистого Groovy вы получите еще один ответ.