列出到 .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
    }
  }
]