Я пытаюсь десериализировать данные в файле Animals.json , но тип подкласса продолжает отображать NULL. См. Ниже для получения подробной информации (все файлы находятся в папке SRC, за исключением GSON-2.11.0.jar в папке LIB). < /P>
[*] Скачать GSON: https://search.maven.org/artifact/com.g ... 2.11.0/jar
[*]runtimeTypeAdapterFactory.java: https://github.com/google/gson/blob/mai ... ctory.java
< /ul>
У меня есть два класса Dog.java и Cat.Java, который расширяет Animal.java. Экземпляры собаки и кошки создаются с использованием AnimalFactory.getAnimal (). < /P>
// Animal.java
public class Animal {
private String animalType;
private String animalName;
private int animalAge;
public Animal(String animalType, String animalName, int animalAge) {
this.animalType = animalType;
this.animalName = animalName;
this.animalAge = animalAge;
}
public String getAnimalType() {
return animalType;
}
public String getAnimalName() {
return animalName;
}
public int getAnimalAge() {
return animalAge;
}
}
< /code>
// Dog.java
public class Dog extends Animal {
private String barkSound;
public Dog(String animalType, String animalName, int animalAge, String barkSound) {
super(animalType, animalName, animalAge);
this.barkSound = barkSound;
}
public void setBark(String barkSound) {
this.barkSound = barkSound;
}
public String getBark() {
return barkSound;
}
@Override
public String toString() {
return "{Animal Type: " + getAnimalType() +
", Animal Name: " + getAnimalName() +
", Animal Age: " + getAnimalAge() +
", Bark Sound: " + getBark() + "}";
}
}
< /code>
// Cat.java
public class Cat extends Animal {
private String meowSound;
public Cat(String animalType, String animalName, int animalAge, String meowSound) {
super(animalType, animalName, animalAge);
this.meowSound = meowSound;
}
public void setMeow(String meowSound) {
this.meowSound = meowSound;
}
public String getMeow() {
return meowSound;
}
@Override
public String toString() {
return "{Animal Type: " + getAnimalType() +
", Animal Name: " + getAnimalName() +
", Animal Age: " + getAnimalAge() +
", Meow Sound: " + getMeow() + "}";
}
}
< /code>
// AnimalFactory.java
public class AnimalFactory {
public static Animal getAnimal(String animalType, String animalName, int animalAge) {
switch (animalType) {
case "dog":
return new Dog(animalType, animalName, animalAge, null);
case "cat":
return new Cat(animalType, animalName, animalAge, null);
default:
return null;
}
}
}
< /code>
// App.java
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
public class App {
public static void main(String[] args) throws Exception {
List myPets = new ArrayList();
FileReader reader = new FileReader("animals.json");
Type type = new TypeToken(){}.getType();
RuntimeTypeAdapterFactory animalAdapter = RuntimeTypeAdapterFactory
.of(Animal.class, "animalType")
.registerSubtype(Dog.class, "dog")
.registerSubtype(Cat.class, "cat");
Gson gson = new GsonBuilder().registerTypeAdapterFactory(animalAdapter).setPrettyPrinting().create();
myPets = gson.fromJson(reader, type);
reader.close();
for (Animal animal : myPets) {
System.out.println(animal);
}
}
}
< /code>
animals.json после использования файла
[
{
"barkSound": "roof",
"animalType": "dog",
"animalName": "Bob",
"animalAge": 10
},
{
"meowSound": "meow",
"animalType": "cat",
"animalName": "Tom",
"animalAge": 20
}
]
< /code>
My output:
{Animal Type: null, Animal Name: Bob, Animal Age: 10, Bark Sound: roof}
{Animal Type: null, Animal Name: Tom, Animal Age: 20, Meow Sound: meow}
Подробнее здесь: https://stackoverflow.com/questions/794 ... -json-file
Не может десериализировать тип подкласса из файла json ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как сериализовать или десериализировать объект JSON на определенную глубину в C#?
Anonymous » » в форуме C# - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-