使用Object作为通用容器

时间:2013-01-29 06:52:33

标签: java gson

我需要创建一个容器对象,其中一个字段充当占位符。

public static class Person {
        String name;
        Object data;        //Placeholder for custom type
}

此容器类型(Person)用于发送json数据,如下面的代码所示,这些数据是de / serialized。

import com.google.gson.Gson;

public class Main {

    public static class Address {
        String city;
        public Address(String city) {
            this.city = city;
        }
    }

    public static class Person {
        String name;
        Object data;        //Placeholder for custom type

        public Person(String name, Object data) {
            this.name = name;
            this.data = data;
        }
    }

    public static void main(String[] args) {
        Address addr = new Address("BBB") ;
        Person person = new Person("AAA", addr);

        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println("json = " + json);

        Person person2 = gson.fromJson(json, Person.class);
        System.out.println("person2  name = " + person2.name);
        System.out.println("person2  address = " + person2.data);
        Address addr2 = (Address)  person2.data;
        System.out.println("address  city = " + addr2.city);
    }
}

2个问题:

  1. 以这种方式使用Object是一种很好的做法。类型之间没有关系进入字段(数据),因此不确定接口是否可行。

  2. 最后会抛出错误。可能是因为,Gson无法弄清楚基础类型。

    json = {"name":"AAA","data":{"city":"BBB"}}  
    person2  name = AAA  
    person2  address = {city=BBB}  
    Exception in thread "main" java.lang.ClassCastException: 
    

    java.util.LinkedHashMap无法强制转换为Main $ Address         在Main.main(Main.java:33)

  3. 编辑:

    根据以下答案,使用班级名称误导了我的问题背后的意图。不是Person,而是说我想建模一个webresponse并称之为Response。该对象可以是任何类型。

    say if you call the API /api/person/1 , you get below response
    Response {
      String message
      Object value //type is Person
    }
    
    if you call an API /api/student/2
    Response {
     String message
     Object value //type is Student
    }
    

    我没有使用反射,无论如何模拟Response对象,所以它接受任何对象作为值并正确地编组到底层类型。匿名类型(没有类型爆炸的一次性类)可能是一个选项,我读过java没有。一个答案表明,不确定如何在这种情况下使用泛型。

    基于此答案,类型擦除可能使其不适合使用泛型。 Using generics with GSON

3 个答案:

答案 0 :(得分:1)

为什么不这样使用Map

public static class Person {
    String name;
    Map data;        //Placeholder for custom type
}

Map可与json兼容。

答案 1 :(得分:0)

  

使用Object这种方式是一种很好的做法。没有关系   类型之间进入字段(数据),所以不确定接口是什么   可行的。

不,使用泛型。

  

最后抛出错误。可能是因为,Gson无法弄清楚了   基础类型。

另外,请使用泛型来避免。

答案 2 :(得分:0)

我将它保存为JsonElement(来自Gson),然后将其解组为正确的类型。