Синтаксический анализ JSON для нескольких коллекций POJOs

#java #json #gson #pojo

#java #json #gson #пойо

Вопрос:

Мне нужно каким-то образом преобразовать одну строку json в несколько объектов определенного типа, используя GSON.

У меня есть формат одной строки json (ниже приведено 2, но может быть и 100)

 {domain : name1, geo: us} {domain : name2, country : uk}
 

Теперь я хочу преобразовать приведенное выше в мои экземпляры pojo, которые сопоставляются с каждой частью строки. Предположим, POJO называется Website. Затем мне нужно разделить строку json на 2 объекта веб-сайта.

Я подумывал о том, чтобы разделить строку json с помощью какого-нибудь токенизатора, а затем применить некоторую логику json к каждой части. Я предполагаю, что мне нужно было бы сделать это, прежде чем применять какой-либо json к преобразованию pojo?

Кажется, я не могу найти способ сделать это. Пожалуйста, сообщите.

большое спасибо

Комментарии:

1. Это не JSON по двум причинам: ключи и строки нуждаются в кавычках; два объекта JSON должны быть в массиве, т. е. [ { ... }, { ... } ]

2. да, к сожалению, застрял с gson. Хотя, если есть альтернативы, я всегда могу попробовать убедить.

3. да, к сожалению, застрял с gson. Хотя, если есть альтернативы, я всегда могу попробовать убедить. @JeremyP каждая запись будет возвращена как отдельный объект json, а не как массив для отображения в браузере. И вы правы, у них будут цитаты, я просто опустил их, сожалея об этом. Есть какие-нибудь советы о том, как тогда прогрессировать?

Ответ №1:

Чтобы десериализовать json в java pojo, попробуйте json-lib, http://json-lib.sourceforge.net /. Это хорошее решение. Хотя я бы использовал flexjson для сериализации.

 String json = "{bool:true,integer:1,string:"json"}";  
JSONObject jsonObject = JSONObject.fromObject( json );  
BeanA bean = (BeanA) JSONObject.toBean( jsonObject, BeanA.class );  
 

где Бина — твой POJO.

Если у вас есть объекты muliple, как вы показали в своем примере, выполните следующие действия

 String json = "{'data':[{'name':'Wallace'},{'name':'Grommit'}]}";
JSONArray jsonArray = (JSONArray) net.sf.json.JSONSerializer.toJSON(json);
for (int i = 0; i < jsonArray.size(); i  ) {
   JSONObject jsonObject = (JSONObject) jsonArray.get(i);
   BeanA bean = (BeanA) JSONObject.toBean( jsonObject, BeanA.class );
   //do whatever you want with each object
}
 

Ответ №2:

Предполагая, что у вас есть веб-сайт класса, подобный этому:

 class Website {
    String domain;
    String geo;
}
 

Сначала исправьте вашу строку, чтобы она была допустимой json:

 String input = "{"domain" : "name1", "geo": "us"} {"domain" : "name2", "country" : "uk"}";

String json = "["   input   "]";
 

Затем используйте стандартную технику gson для преобразования в список веб-сайтов:

 java.lang.reflect.Type t = new TypeToken<List<Website>>(){}.getType();
List<Website> websites = new Gson().fromJson(json, t);