Как проанализировать эти данные JSON с помощью GSON? и поместить его в ArrayList

#android #json #parsing #mongodb #gson

#Android #json #синтаксический анализ #mongodb #gson

Вопрос:

Я пытаюсь проанализировать данные с облачного сервера MongoDB. Мои данные JSON, возвращаемые с сервера, выглядят следующим образом:

 [
{
    "_id": {
        "$oid": "4e78eb48737d445c00c8826b"
    },
    "message": "cmon",
    "type": 1,
    "loc": {
        "longitude": -75.65530921666667,
        "latitude": 41.407904566666666
    },
    "title": "test"
},
{
    "_id": {
        "$oid": "4e7923cb737d445c00c88289"
    },
    "message": "yo",
    "type": 4,
    "loc": {
        "longitude": -75.65541383333333,
        "latitude": 41.407908883333334
    },
    "title": "wtf"
},
{
    "_id": {
        "$oid": "4e79474f737d445c00c882b2"
    },
    "message": "hxnxjx",
    "type": 4,
    "loc": {
        "longitude": -75.65555572509766,
        "latitude": 41.41263961791992
    },
    "title": "test cell"
}
  

]

Проблема, с которой я сталкиваюсь, заключается в том, что возвращаемая структура данных не содержит имени массива объектов JSON. Каждый возвращаемый объект является «сообщением». Но как мне проанализировать его с помощью GSON, если для массива объектов JSON нет имени. Я хотел бы поместить эти «сообщения» в ArrayList типа Post.

Ответ №1:

Фрагмент кода, который вы ищете:

 String jsonResponse = "bla bla bla";
Type listType = new TypeToken<List<Post>>(){}.getType();
List<Post> posts = (List<Post>) gson.fromJson(jsonResponse, listType);
  

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

1. Это должно быть принятым ответом. Ответ Sam_D работает, но этот код выглядит значительно быстрее и может быть заметен на больших массивах JSONArrays.

2. Да, намного быстрее при работе с большим json

3. потрясающе! не могли бы вы объяснить, как это работает? строки 2 и 3

Ответ №2:

Используйте конструктор для JSONArray для анализа строки:

 //optionally use the com.google.gson.Gson package
Gson gson = new Gson();
ArrayList<Post> yourList = new ArrayList<Post>();
String jsonString = "your string";
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i  ){
  Post post = new Post();

  //manually parse for all 5 fields, here's an example for message
  post.setMessage(jsonArray.get(i).getString("message")); 

  //OR using gson...something like this should work
  //post = gson.fromJson(jsonArray.get(i),Post.class);

  yourList.Add(post);
 }
  

Учитывая, что существует всего 5 полей, использование Gson может потребовать больше затрат, чем вам нужно.

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

1. ну, я планирую добавить больше полей по мере продолжения моего проекта