列出到 .json 并列出对象 class 名称
List to .json and to list with object class name
我有不同对象的列表
List<Object> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
我需要根据该列表制作 .json 文件。然后我需要用对象的所有属性和名称打印这个文件 class 像这样:
Worker: name:John, surname:Bep, work:Farmer,salary:2500
我已经这样做了:
public String listToJson() throws JsonProcessingException {
List<Object> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
String s = objectMapper.writeValueAsString(people);
return s;
}
public void jsonToList() throws IOException {
String s = listToJson();
TypeReference<List<Object>> mapType = new TypeReference<List<Object>>() {};
List<Object>jsonToOList= objectMapper.readValue(s,mapType);
jsonToOList.forEach(System.out::println);
}
我也继承了 List<Person> people
但它返回了相同的结果。
现在的输出是:{name:John, surname:Bep, work:Farmer,salary:2500}
没有 worker
如果这就是您要找的答案;
[
{
"Worker": {
"name": "John",
"surname": "Bep",
"work": "Farmer",
"salary": 2500
}
},
{
"Teacher": {
"name": "Jacob",
"surname": "Hiu",
"branch": "Biology",
"classes": 2
}
},
{
"PoliceMan": {
"name": "Zoe",
"surname": "Clain",
"precint": 35,
"salary": 2800
}
},
{
"PoliceMan": {
"name": "Joe",
"surname": "Plain",
"precint": 35,
"salary": 2800
}
}
]
那么可以不加任何注解,如下操作;
@Test
void t1() throws Exception {
// init
List<Person> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
//test
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(
people.stream().map(
p-> Collections.singletonMap(p.getClass().getSimpleName(), p)
).collect(Collectors.toList())
);
System.out.println(s);
}
// Assuming you have such pojo classes...
private class Person {
String name;
String surname;
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
}
private class Worker extends Person {
String work;
int salary;
public Worker(String name, String surname, String work, int salary) {
super(name, surname);
this.work = work;
this.salary = salary;
}
public String getWork() {
return work;
}
public int getSalary() {
return salary;
}
}
private class Teacher extends Person {
String branch;
int classes;
public Teacher(String name, String surname, int classes, String branch) {
super(name, surname);
this.branch = branch;
this.classes = classes;
}
public String getBranch() {
return branch;
}
public int getClasses() {
return classes;
}
}
private class PoliceMan extends Person {
int precint;
int salary;
public PoliceMan(String name, String surname, int precint, int salary) {
super(name, surname);
this.precint = precint;
this.salary = salary;
}
public int getPrecint() {
return precint;
}
public int getSalary() {
return salary;
}
}
如果还需要反序列化,提供完整的class名称是不可避免的,如下解决方案;
@Test
void t1() throws Exception {
// init
List<Person> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
people.add(new PoliceMan("Joe", "Plain", 35, 2800));
// serialize
ObjectMapper om = new ObjectMapper();
JavaType plType = om.getTypeFactory().constructCollectionLikeType(List.class, Person.class);
//serialize
String s = om.writerFor(plType).writeValueAsString(people);
System.out.println(s);
//deserialize
List<Person> p = om.readValue(s, om.getTypeFactory().constructCollectionLikeType(List.class, Person.class));
System.out.println(p.get(0).getClass().getSimpleName());
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
public static abstract class Person {
String name;
String surname;
public Person() {
}
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
}
public static class Worker extends Person {
String work;
int salary;
public Worker() {
super();
}
public Worker(String name, String surname, String work, int salary) {
super(name, surname);
this.work = work;
this.salary = salary;
}
public String getWork() {
return work;
}
public int getSalary() {
return salary;
}
}
public static class Teacher extends Person {
String branch;
int classes;
public Teacher() {
super();
}
public Teacher(String name, String surname, int classes, String branch) {
super(name, surname);
this.branch = branch;
this.classes = classes;
}
public String getBranch() {
return branch;
}
public int getClasses() {
return classes;
}
}
public static class PoliceMan extends Person {
int precinct;
int salary;
public PoliceMan() {
super();
}
public PoliceMan(String name, String surname, int precinct, int salary) {
super(name, surname);
this.precinct = precinct;
this.salary = salary;
}
public int getPrecinct() {
return precinct;
}
public int getSalary() {
return salary;
}
}
输出结果如下;
[
{
"some.package.name$Worker": {
"name": "John",
"surname": "Bep",
"work": "Farmer",
"salary": 2500
}
},
{
"some.package.name$Teacher": {
"name": "Jacob",
"surname": "Hiu",
"branch": "Biology",
"classes": 2
}
},
{
"some.package.name$PoliceMan": {
"name": "Zoe",
"surname": "Clain",
"precinct": 35,
"salary": 2800
}
},
{
"some.package.name$PoliceMan": {
"name": "Joe",
"surname": "Plain",
"precinct": 35,
"salary": 2800
}
}
]
我有不同对象的列表
List<Object> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
我需要根据该列表制作 .json 文件。然后我需要用对象的所有属性和名称打印这个文件 class 像这样:
Worker: name:John, surname:Bep, work:Farmer,salary:2500
我已经这样做了:
public String listToJson() throws JsonProcessingException {
List<Object> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
String s = objectMapper.writeValueAsString(people);
return s;
}
public void jsonToList() throws IOException {
String s = listToJson();
TypeReference<List<Object>> mapType = new TypeReference<List<Object>>() {};
List<Object>jsonToOList= objectMapper.readValue(s,mapType);
jsonToOList.forEach(System.out::println);
}
我也继承了 List<Person> people
但它返回了相同的结果。
现在的输出是:{name:John, surname:Bep, work:Farmer,salary:2500}
没有 worker
如果这就是您要找的答案;
[
{
"Worker": {
"name": "John",
"surname": "Bep",
"work": "Farmer",
"salary": 2500
}
},
{
"Teacher": {
"name": "Jacob",
"surname": "Hiu",
"branch": "Biology",
"classes": 2
}
},
{
"PoliceMan": {
"name": "Zoe",
"surname": "Clain",
"precint": 35,
"salary": 2800
}
},
{
"PoliceMan": {
"name": "Joe",
"surname": "Plain",
"precint": 35,
"salary": 2800
}
}
]
那么可以不加任何注解,如下操作;
@Test
void t1() throws Exception {
// init
List<Person> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
//test
ObjectMapper om = new ObjectMapper();
String s = om.writeValueAsString(
people.stream().map(
p-> Collections.singletonMap(p.getClass().getSimpleName(), p)
).collect(Collectors.toList())
);
System.out.println(s);
}
// Assuming you have such pojo classes...
private class Person {
String name;
String surname;
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
}
private class Worker extends Person {
String work;
int salary;
public Worker(String name, String surname, String work, int salary) {
super(name, surname);
this.work = work;
this.salary = salary;
}
public String getWork() {
return work;
}
public int getSalary() {
return salary;
}
}
private class Teacher extends Person {
String branch;
int classes;
public Teacher(String name, String surname, int classes, String branch) {
super(name, surname);
this.branch = branch;
this.classes = classes;
}
public String getBranch() {
return branch;
}
public int getClasses() {
return classes;
}
}
private class PoliceMan extends Person {
int precint;
int salary;
public PoliceMan(String name, String surname, int precint, int salary) {
super(name, surname);
this.precint = precint;
this.salary = salary;
}
public int getPrecint() {
return precint;
}
public int getSalary() {
return salary;
}
}
如果还需要反序列化,提供完整的class名称是不可避免的,如下解决方案;
@Test
void t1() throws Exception {
// init
List<Person> people = new ArrayList<>();
people.add(new Worker("John", "Bep", "Farmer", 2500));
people.add(new Teacher("Jacob", "Hiu", 2, "Biology"));
people.add(new PoliceMan("Zoe", "Clain", 35, 2800));
people.add(new PoliceMan("Joe", "Plain", 35, 2800));
// serialize
ObjectMapper om = new ObjectMapper();
JavaType plType = om.getTypeFactory().constructCollectionLikeType(List.class, Person.class);
//serialize
String s = om.writerFor(plType).writeValueAsString(people);
System.out.println(s);
//deserialize
List<Person> p = om.readValue(s, om.getTypeFactory().constructCollectionLikeType(List.class, Person.class));
System.out.println(p.get(0).getClass().getSimpleName());
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
public static abstract class Person {
String name;
String surname;
public Person() {
}
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
}
public static class Worker extends Person {
String work;
int salary;
public Worker() {
super();
}
public Worker(String name, String surname, String work, int salary) {
super(name, surname);
this.work = work;
this.salary = salary;
}
public String getWork() {
return work;
}
public int getSalary() {
return salary;
}
}
public static class Teacher extends Person {
String branch;
int classes;
public Teacher() {
super();
}
public Teacher(String name, String surname, int classes, String branch) {
super(name, surname);
this.branch = branch;
this.classes = classes;
}
public String getBranch() {
return branch;
}
public int getClasses() {
return classes;
}
}
public static class PoliceMan extends Person {
int precinct;
int salary;
public PoliceMan() {
super();
}
public PoliceMan(String name, String surname, int precinct, int salary) {
super(name, surname);
this.precinct = precinct;
this.salary = salary;
}
public int getPrecinct() {
return precinct;
}
public int getSalary() {
return salary;
}
}
输出结果如下;
[
{
"some.package.name$Worker": {
"name": "John",
"surname": "Bep",
"work": "Farmer",
"salary": 2500
}
},
{
"some.package.name$Teacher": {
"name": "Jacob",
"surname": "Hiu",
"branch": "Biology",
"classes": 2
}
},
{
"some.package.name$PoliceMan": {
"name": "Zoe",
"surname": "Clain",
"precinct": 35,
"salary": 2800
}
},
{
"some.package.name$PoliceMan": {
"name": "Joe",
"surname": "Plain",
"precinct": 35,
"salary": 2800
}
}
]