java - 使用对象作为通用容器

标签 java gson

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

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. 以这种方式使用对象是一个很好的实践。进入字段(数据)的类型之间没有关系,因此不确定接口(interface)是否可行。

  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)

编辑:

根据下面的答案,类名的使用误导了我的问题背后的意图。假设我想对网络响应进行建模并将其命名为 Response,而不是 Person。该对象可以是任何类型。

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

最佳答案

为什么不使用这样的Map:

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

Map可以兼容json。

关于java - 使用对象作为通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14577227/

相关文章:

java - 如何从 JSP 页面引用 java .class 文件?

java - 按字母顺序对 Java 对象排序为 JSON 对象

java - 每个键的 map 值总和

java - Gson反序列化: How to distinguish between fields that are missing and fields that are explicitly set to null?

json - 如何在 Spring MVC 中将字符串转换为对象

java - 使用Gson解析动态JSON数据

java - Logback RollingFileAppender FileNotFoundException

java - 如何从 void 方法显示数组?

android - 使用 GSON 从 URL 解析 JSON

java - 如何将缓存的 json 字符串与 gson 一起使用?