杰克逊:将JSON转换为object:具有对象arraylist的对象的ArrayList,具有对象的arraylist

时间:2014-12-15 10:07:09

标签: java android json jackson

我有一个Android应用程序,它打电话做休息api。 它返回一个餐馆列表。每家餐厅都有类别列表。每个类别都可以有多种菜肴。

当我反序列化这个列表时,我有很好的ArrayList of Restaurants,每个Restaurant也有一个ArrayList类别,但是在Category类中,Dishes的ArrayList是null。

有没有人知道如何解决这个问题?

JSON响应:(它实际上是ServiceResponse类型的对象)

{
 "requestToken" : 0,
  "responseCode" : 2,
  "objectType" : "com.test.Restaurant",
  "error" : null,
 "data" : [ {
    "id" : 1,
    "name" : "Name",
    "addressCity" : "Warszawa",
    "addressStreet" : "Kopernika",
    "addressStreetNumber" : "4",
    "addressApartmentNumber" : "17",
    "categories" : [ {
      "id" : 1,
      "restaurantId" : 1,
      "name" : "Breakfast",
      "description" : "Description",
      "dishes" : [ {
        "id" : 11,
        "categoryId" : 1,
        "name" : "Dish 1",
        "description" : "Descr",
        "price" : 8.99,
        "photoId" : 51
      }, {
        "id" : 21,
        "categoryId" : 1,
        "name" : "Dish 2",
        "description" : "Descr",
        "price" : 6.99,
        "photoId" : 41
      }, {
        "id" : 31,
        "categoryId" : 1,
        "name" : "Dish 3",
        "description" : "Descr",
        "price" : 14.99,
        "photoId" : 61
      } ]
    }, {
      "id" : 2,
      "restaurantId" : 1,
      "name" : "Obiady",
      "description" : "Opis kategorii",
      "dishes" : [ {
        "id" : 41,
        "categoryId" : 2,
        "name" : "Danie 4",
        "description" : "Descr",
        "price" : 6.99,
        "photoId" : 0
      }, {
        "id" : 61,
        "categoryId" : 2,
        "name" : "Danie 5",
        "description" : "Descr",
        "price" : 8.0,
        "photoId" : 0
      }, {
        "id" : 101,
        "categoryId" : 2,
        "name" : "Nowy obiad",
        "description" : "",
        "price" : 111.0,
        "photoId" : 0
      } ]
    }, {
      "id" : 3,
      "restaurantId" : 1,
      "name" : "Pasta",
      "description" : "Opis kategorii",
      "dishes" : [ ]
    }, {
      "id" : 4,
      "restaurantId" : 1,
      "name" : "Przystawki",
      "description" : "Opis kategorii",
     "dishes" : [ ]
    }, {
      "id" : 11,
      "restaurantId" : 1,
      "name" : "Some category",
      "description" : "test",
      "dishes" : [ ]
    }, {
      "id" : 51,
      "restaurantId" : 1,
      "name" : "Sushi",
      "description" : "",
      "dishes" : [ ]
    } ]
  }]
  }

解析杰克逊的结果:

ServiceResponse response = getServiceOutput(params, httpMethod);

if(response.getData() != null && response.getData().size() > 0) {
    try {
        // convert data array from object to class defined in objectType (in JSON)
        ObjectMapper mapper = new ObjectMapper();
        Class clazz = Class.forName( response.getObjectType() );
        ArrayList list = (mapper.convertValue(response.getData(), 
            TypeFactory.defaultInstance().constructCollectionType(
                    ArrayList.class, clazz)));

        broadcastIntent.putExtra("result", list);
        broadcastIntent.putExtra("response_code", ServiceResponse.OK);
    } catch (Exception e) {
        broadcastIntent.putExtra("response_code", ServiceResponse.ERROR);
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

这对我有用。我将类(Response,Restaurant等)声明为静态的原因是因为Jackson无法反序列化非静态内部类。

 public class Test {

static String jsonString = "{ \"requestToken\":0, \"responseCode\":2, \"objectType\":\"com.test.Restaurant\", \"error\":null, \"data\":[ { \"id\":1, \"name\":\"Name\", \"addressCity\":\"Warszawa\", \"addressStreet\":\"Kopernika\", \"addressStreetNumber\":\"4\", \"addressApartmentNumber\":\"17\", \"categories\":[ { \"id\":1, \"restaurantId\":1, \"name\":\"Breakfast\", \"description\":\"Description\", \"dishes\":[ { \"id\":11, \"categoryId\":1, \"name\":\"Dish 1\", \"description\":\"Descr\", \"price\":8.99, \"photoId\":51 }, { \"id\":21, \"categoryId\":1, \"name\":\"Dish 2\", \"description\":\"Descr\", \"price\":6.99, \"photoId\":41 }, { \"id\":31, \"categoryId\":1, \"name\":\"Dish 3\", \"description\":\"Descr\", \"price\":14.99, \"photoId\":61 } ] }, { \"id\":2, \"restaurantId\":1, \"name\":\"Obiady\", \"description\":\"Opis kategorii\", \"dishes\":[ { \"id\":41, \"categoryId\":2, \"name\":\"Danie 4\", \"description\":\"Descr\", \"price\":6.99, \"photoId\":0 }, { \"id\":61, \"categoryId\":2, \"name\":\"Danie 5\", \"description\":\"Descr\", \"price\":8.0, \"photoId\":0 }, { \"id\":101, \"categoryId\":2, \"name\":\"Nowy obiad\", \"description\":\"\", \"price\":111.0, \"photoId\":0 } ] }, { \"id\":3, \"restaurantId\":1, \"name\":\"Pasta\", \"description\":\"Opis kategorii\", \"dishes\":[ ] }, { \"id\":4, \"restaurantId\":1, \"name\":\"Przystawki\", \"description\":\"Opis kategorii\", \"dishes\":[ ] }, { \"id\":11, \"restaurantId\":1, \"name\":\"Some category\", \"description\":\"test\", \"dishes\":[ ] }, { \"id\":51, \"restaurantId\":1, \"name\":\"Sushi\", \"description\":\"\", \"dishes\":[ ] } ] } ] }";

public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    Response res = mapper.readValue(jsonString, Response.class);
}

public static class Response {
    public String requestToken;
    public List<Restaurant> data;

    public Response(){}

    public String getRequestToken() {
        return requestToken;
    }

    public void setRequestToken(String requestToken) {
        this.requestToken = requestToken;
    }

    public List<Restaurant> getData() {
        return data;
    }

    public void setData(List<Restaurant> data) {
        this.data = data;
    }
}

public static class Restaurant {
    public List<Category> categories;

    public List<Category> getCat() {
        return categories;
    }

    public void setCat(List<Category> categories) {
        this.categories = categories;
    }

    public Restaurant(){}
}

public static class Category {
    public List<Dish> dishes;

    public Category(){}

    public List<Dish> getDishes() {
        return dishes;
    }

    public void setDishes(List<Dish> dishes) {
        this.dishes = dishes;
    }
}

public static class Dish {

    public String id, categoryId, name, description;
    public float price;
    public int photoId;

    public Dish(){}

}
}