Как я могу преобразовать простой объект JSON во вложенный объект JSON - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть 14 простых объектов json, и я хочу сформировать один вложенный вывод json

Ввод:

{
 "School": "Happy",
 "Teacher": "Mellisa",
 "grade": "sixth",
 "Student name": "Rob",
 "Subject": "botany"
}
{
 "School": "Happy",
 "Teacher": "Mellisa",
 "grade": "sixth",
 "Student name": "Rob",
 "Subject": "zoology"
}
{
 "School": "Happy",
 "Teacher": "Mellisa",
 "grade": "sixth",
 "Student name": "kevin",
 "Subject": "botany"
}
{
 "School": "Happy",
 "Teacher": "Mellisa",
 "grade": "sixth",
 "Student name": "kevin",
 "Subject": "botany"
}
{
 "School": "Happy",
 "Teacher": "Petter",
 "grade": "sixth",
 "Student name": "tim",
 "Subject": "botany"
}
{
 "School": "Happy",
 "Teacher": "Petter",
 "grade": "sixth",
 "Student name": "tim",
 "Subject": "zoology"
}
{
 "School": "Happy",
 "Teacher": "Petter",
 "grade": "sixth",
 "Student name": "david",
 "Subject": "botany"
}
{
  "School": "Happy",
  "Teacher": "Petter",
  "grade": "sixth",
  "Student name": "david",
  "Subject": "zoology"
}
{
  "School": "Happy",
  "Teacher": "Mellisa",
  "grade": "seventh",
  "Student name": "jane",
  "Subject": "math"
 }
{
  "School": "Happy",
  "Teacher": "Mellisa",
  "grade": "seventh",
  "Student name": "Lin",
  "Subject": "physics"
}
{
 "School": "Happy",
 "Teacher": "Mellisa",
 "grade": "seventh",
 "Student name": "jane",
 "Subject": "math"
}
{
  "School": "Happy",
  "Teacher": "Mellisa",
  "grade": "seventh",
  "Student name": "Lin",
  "Subject": "physics"
 }
{
  "School": "Happy",
  "Teacher": "Petter",
  "grade": "seventh",
  "Student name": "jane",
  "Subject": "math"
 }
{
  "School": "Happy",
  "Teacher": "Petter",
  "grade": "seventh",
  "Student name": "Lin",
  "Subject": "physics"
 }

Вывод:

{
"School": "Happy",
"Teacher": [
    {
        "name": "petter",
        "Student": [
            {
                "name": "Lin",
                "grade":"seventh",
                "Subject": [
                    {
                        "name": "physics"
                    },
                    {
                        "name": "math"
                    }
                ]
            },
            {
                "name": "Jane",
                "grade":"seventh",
                "Subject": [
                    {
                        "name": "physics"
                    },
                    {
                        "name": "math"
                    }
                ]
            }
        ]
    }
]
}

1 Ответ

0 голосов
/ 10 ноября 2019

Ну, этот вопрос настолько многословен! и это требует знания некоторой библиотеки josn. (Я использовал эту библиотеку )

, прежде всего вам нужно определить класс, чтобы сопоставить с ним ваши данные json. так как некоторые ключи json начинаются с заглавных букв и это не похоже на синтаксис java, я использовал аннотацию @JsonProperty.

 class JsonData {
    @JsonProperty("School")
    private String school;
    @JsonProperty("Teacher")
    private String teacher;
    private String grade;
    @JsonProperty("Student name")
    private String studentName;
    @JsonProperty("Subject")
    private String subject;
}

Чтобы преобразовать строку json в объект, вы можете использовать следующий код:

ObjectMapper mapper = new ObjectMapper();
List<JsonData> list = mapper.readValue(jsonString, new TypeReference<List<JsonData>>() {}); 

после преобразования строки json в объект, сгруппировав ее по нескольким свойствам (школа, учитель, ученик)

Map<String, Map<String, Map<String, List<JsonData>>>> result = list.stream()
         .collect(Collectors
                 .groupingBy(JsonData::getSchool, Collectors
                        .groupingBy(JsonData::getTeacher, Collectors
                            .groupingBy(JsonData::getStudentName, Collectors.toList()))));  

на выходе получается:

{Happy=
   {Mellisa=
    {Lin=[
      JsonData{school='Happy', ....},
      JsonData{school='Happy', ....}],

на последнем шаге с циклом по предыдущему результату будет создан конечный объект.

ResultData resultData = null;
Teacher teacher = null;
Student student;
for (Map.Entry<String, Map<String, Map<String, List<JsonData>>>> entry : result.entrySet()) {
    resultData = new ResultData(entry.getKey());
   for (Map.Entry<String, Map<String, List<JsonData>>> entry1 : entry.getValue().entrySet()) {
        teacher = new Teacher(entry1.getKey());
        for (Map.Entry<String, List<JsonData>> entry2 : entry1.getValue().entrySet()) {
             student = new Student(entry2.getKey());
             for (JsonData jsonData : entry2.getValue()) {
                    student.setGrade(jsonData.getGrade());
                    student.getSubject().add(new Subject(jsonData.getSubject()));
                }
                teacher.getStudent().add(student);
            }
        }
        resultData.getTeacher().add(teacher);
    }

другие классы, которые использовали в этом:

class ResultData {
  private String school;
  private List<Teacher> teacher = new ArrayList<>();
}

class Teacher {
  private String name;
  private List<Student> student = new ArrayList<>();
}

class Student {
  private String name;
  private String grade;
  private List<Subject> subject = new ArrayList<>();
}

class Subject {
  private String name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...