Использование объекта в качестве универсального контейнера

Мне нужно создать контейнерный объект, в котором одно поле действует как заполнитель.

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. Is using Object this way is a good practice. There is no relation between types goes into the field (data), so not sure interface is viable.

  2. It throws error at the end. May be because, Gson cannot figure out the underlying type.

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

    java.util.LinkedHashMap cannot be cast to Main$Address at Main.main(Main.java:33)

РЕДАКТИРОВАТЬ:

Основываясь на ответах ниже, использование имени класса неверно отражает намерение моего вопроса. Вместо 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, чтобы он принимал любой объект в качестве значения и правильно сортировал базовый тип. Анонимный тип (класс throwaway без взрыва типа) может быть вариантом, который я не читаю java. Не уверен, как использовать Generics в этом контексте, как предлагает один ответ.

Based on this answer, type erasure may make it not suitable to use generics. Using generics with GSON

0
nl ja de
Зачем вам нужен особый тип?
добавлено автор StarPinkER, источник
Если вы настаиваете на том, чтобы сделать это неправильно, вы могли бы написать собственный десериализатор, который делает все, что вам действительно нужно, для Object ... why , который вы хотели бы сделать, это неясно, но так вам нужно будет это делать. У вас нет объекта Object в вашем JSON, у вас есть определенный тип вещей.
добавлено автор Brian Roach, источник

3 ответы

Почему бы не использовать Map , как это:

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

Map can compatible will with json.

1
добавлено

Я сохраняю его как JsonElement (от Gson), который затем отменяет правильный тип.

0
добавлено

Использование объекта таким образом является хорошей практикой. Нет никакого отношения   между типами идет в поле (данные), поэтому не уверен интерфейс   жизнеспособными.

Нет, используйте дженерики.

Он выдает ошибку в конце. Может быть, потому что, Гссон не может понять   базовый тип.

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

0
добавлено
Вопрос: Не могли бы вы обновить свой пост и привести пример?
добавлено автор paulsm4, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async