2014-11-13 5 views
0

У меня есть строка JSON, который выглядит следующим образом:коллекции прихлебывая JSON в Groovy

String json = """ 
    {  
     "content":{ 
      "response":{ 
       "body": [ 
        { 
         "firstName":"Jim", 
         "lastName":"Smith" 
        }, 
        { 
         "firstName":"Joe", 
         "lastName":"Smith" 
        }, 
        { 
         "firstName":"Jane", 
         "lastName":"Smith" 
        } 
       ] 
      } 
     } 
    } 
""" 

У меня есть POJO, который выглядит следующим образом:

class Person { 
    String firstName 
    String surname 
} 

я могу изменить ни строки JSON I (на самом деле это JSON, возвращающийся из веб-службы), и POJO (принадлежащий/обслуживаемый другой командой).

Я хотел бы превратить этот JSON в List<Person>.

Моя попытка с помощью JsonSlurper не удается:

JsonSlurper slurper = new JsonSlurper() 
List<Person> people = [] 
// The problem is I don't know how many people there will be so 
// not sure how to index the slurper. 

Я думаю лучший подход к перебирать slurper и превратить каждый человек JSON объект в Person инстанции, а затем добавить этот человек в список people. Но я не знаком с API JsonSlurper или как лучше всего подходит.

+1

к сведению, что в формате JSON есть недействительный. вам может потребоваться запустить LAX-режим. – cfrick

+0

Извинения @cfrick (+1) - ошибка копирования/вставки; см. мою ревизию. – smeeb

ответ

2

Вы получаете список, collect() ИНГ записей:

List<Person> l = slurper.content.response.body.collect{ new Person(firstName: it.firstName, surname: it.lastName) } 

например:

import groovy.json.JsonSlurper 
import groovy.transform.ToString 

String json = """ 
    {  
     "content":{ 
      "response":{ 
       "body": [ 
        { 
         "firstName":"Jim", 
         "lastName":"Smith", 
        }, 
        { 
         "firstName":"Joe", 
         "lastName":"Smith", 
        }, 
        { 
         "firstName":"Jane", 
         "lastName":"Smith", 
        } 
       ] 
      } 
     } 
    } 
""" 

@ToString 
class Person { 
    String firstName 
    String surname 
} 

def slurped = new JsonSlurper().parseText(json) 
List<Person> l = slurped.content.response.body.collect {new Person(firstName: it.firstName, surname: it.lastName) } 
assert l.size() == 3 
+0

кода не хватает 'slurped'. должен быть либо LAX slurper (не проверен), либо JSON должен быть исправлен (проверен). – cfrick

+0

Я исправил JSON и добавил «slurped». – Opal

0

хорошо, нет необходимости явно построить Person объект:

(заводной-оболочки)

@ToString 
class Person { 
    String firstName 
    String lastName 
} 

slurped = new JsonSlurper().parseText(json) 
l = slurped.content.response.body.collect {it as Person} 

Просто убедитесь, что тип Person представляет json полностью (например. имена полей равны) Это сложная часть, потому что синтаксический анализатор Groovy является капризным. Я имею в виду, если вы не переименовать surname в lastName, список JSON будет анализироваться, но все поле всех трех случаев человека будет оставаться null

Более магией с объектами, если вам не нравится, динамически типизированных карты:

@ToString 
class Some { 
    Content content 
} 

@ToString 
class Content { 
    Response response 
} 

@ToString 
class Response { 
    Person[] body 
} 

cnt = slurped as Some 
println cnt.dump() 

напечатает

<[email protected] content=Content(Response([Person(Jim, Smith), Person(Joe, Smith), Person(Jane, Smith)]))> 
Смежные вопросы