0

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

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

此容器类型(Person)用于发送 json 数据,该数据被反序列化,如下面的代码所示。

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.main(Main.java:33) 处转换​​为 Main$Address

编辑:

根据下面的答案,使用类名误导了我的问题背后的意图。而不是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 没有。正如一个答案所暗示的那样,不确定如何在这种情况下使用泛型。

基于这个答案,类型擦除可能使其不适合使用泛型。 在 GSON 中使用泛型

4

3 回答 3

1

为什么不Map这样使用:

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

Map可以与json兼容。

于 2013-01-29T07:04:58.757 回答
0

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

不,使用泛型。

它在最后抛出错误。可能是因为,Gson 无法弄清楚底层类型。

此外,使用泛型来避免 .

于 2013-01-29T06:55:06.827 回答
0

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

于 2013-02-05T12:56:58.070 回答