Gson и десериализация массива объектов с массивами в нем


Я пытаюсь использовать Gson для десериализации строки json, возвращенной из моего веб-сервиса

структура будет возвращена как TypeDTO[].

здесь TypeDTO как

int id;
String name;
ArrayList<ItemDTO> items[] 

а ItemDTO это как

int id;
String name;
Boolean valid;

когда я вызываю следующий код

Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);

все внутри объектов равно null

однако, если я использую

JSONArray и JSONObject чтобы вытащить их по частям из организации.формат JSON банки, он отлично работает, и поля заполняются соответственно.

есть идеи относительно того, что я делаю неправильно? является ли Gson чрезвычайно быстрым? Или мне лучше придерживаться того, что я уже работаю?

спасибо, Дэвид

2 56

2 ответа:

пример структуры данных Java в исходном вопросе не соответствует описанию структуры JSON в комментарии.

JSON описывается как

" массив {объекта с массивом {объекта}}".

С точки зрения типов, описанных в вопросе, JSON переведен в структуру данных Java, которая будет соответствовать структуре JSON для легкой десериализации с помощью Gson is

"массив {TypeDTO объект с массивом {ItemDTO объект}}".

но структура данных Java, представленная в вопросе, не такая. Вместо этого это

" массив {TypeDTO объекта с массивом массива {ItemDTO объекта}}".

двумерный массив != одномерный массив.

этот первый пример демонстрирует использование Gson для простой десериализации и сериализации структуры JSON, которая является " массивом {object with an массив объектов."}}

вход.содержание json:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      {"id":2,"name":"name2","valid":true},
      {"id":3,"name":"name3","valid":false},
      {"id":4,"name":"name4","valid":true}
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      {"id":6,"name":"name6","valid":true},
      {"id":7,"name":"name7","valid":false}
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      {"id":9,"name":"name9","valid":true},
      {"id":10,"name":"name10","valid":false},
      {"id":11,"name":"name11","valid":false},
      {"id":12,"name":"name12","valid":true}
    ]
  }
]

Фу.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items;
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

во втором примере вместо этого используется структура JSON, которая на самом деле является" массивом {TypeDTO object с массивом массива {ItemDTO object}}", чтобы соответствовать первоначально предоставленной структуре данных Java.

вход.формат JSON Содержание:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      [
        {"id":2,"name":"name2","valid":true},
        {"id":3,"name":"name3","valid":false}
      ],
      [
        {"id":4,"name":"name4","valid":true}
      ]
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      [
        {"id":6,"name":"name6","valid":true}
      ],
      [
        {"id":7,"name":"name7","valid":false}
      ]
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      [
        {"id":9,"name":"name9","valid":true},
        {"id":10,"name":"name10","valid":false}
      ],
      [
        {"id":11,"name":"name11","valid":false},
        {"id":12,"name":"name12","valid":true}
      ]
    ]
  }
]

Фу.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items[];
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

относительно оставшихся двух вопросов:

является ли Gson чрезвычайно быстрым?

не по сравнению с другими API десериализации/сериализации. Gson традиционно был среди the самый медленный. Текущие и следующие выпуски Gson, как сообщается, включают значительные улучшения производительности, хотя я не искал последних данные теста производительности для поддержки этих утверждений.

тем не менее, если Gson достаточно быстр для ваших нужд, то, поскольку это делает десериализацию JSON настолько легкой, вероятно, имеет смысл ее использовать. Если требуется лучшая производительность, то Джексон может быть лучшим выбором для использования. Он предлагает много (возможно, даже все) удобства Gson.

или мне лучше придерживаться того, что я уже работаю?

Я бы не стал. Я бы большинство всегда достаточно есть одна простая строка кода типа

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);

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

используйте свой класс bean следующим образом, если ваши данные JSON начинаются с объекта массива. это тебе поможет.

Users[] bean = gson.fromJson(response,Users[].class);

пользователи-это мой класс bean.

ответ-это мои данные JSON.