Как писать внутри существующего узла json без потери данных в java?

Я разрабатываю консольное приложение java и использую JSON для хранения данных. Это мой вопрос. Я хочу добавить данные внутри существующего узла без потери данных.

У меня есть этот узел:

Теперь я хочу записать новые данные внутри курса, например

2 ответа

Решение

Не вставляйте фрагмент кода в качестве изображения в свой вопрос. Похоже, что указанная вами структура json недействительна. Пожалуйста, обратитесь к приведенному ниже коду.

Фактический Json (перед запуском программы):

      {
  "course": [
    {
      "course": "course1",
      "StartDate": "16/09/2021",
      "EndDate": "16/09/2022"
    },
    {
      "course": "course2",
      "StartDate": "01/10/2021",
      "EndDate": "01/10/2022"
    }
  ]
}

Исходный код:

      import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

public class SO2 {


    public static void main(String[] args) {

        List<CourseDetail> courseList = new ArrayList<>();
        courseList.add(new CourseDetail("course3", "09/09/2021", "09/09/2022"));

        writeCourseList(courseList, "/Users/MyiCloud/Documents/Java/MavenOfflineMode/json", "courses.json");
    }

    public static void writeCourseList(List<CourseDetail> courseList, String path, String fileName) {
        Course course = null;
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            byte[] jsonData = Files.readAllBytes(Paths.get(path + File.separator + fileName));
            course = objectMapper.readValue(jsonData, Course.class);

            List<CourseDetail> existingCourseList = course.getCourseList();
            if(null != existingCourseList && existingCourseList.size() > 0) {
                courseList.forEach(newCourse -> existingCourseList.add(newCourse));
                course.setCourseList(existingCourseList);
            } else {
                course.setCourseList(courseList);
            }
            objectMapper.writeValue(new File(path + File.separator + fileName), course);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Course {
    @JsonProperty("course")
    private List<CourseDetail> courseList = new ArrayList<>();

    public List<CourseDetail> getCourseList() {
        return courseList;
    }

    public void setCourseList(List<CourseDetail> courseList) {
        this.courseList = courseList;
    }
}

class CourseDetail {

    @JsonProperty("course")
    private String courseName;
    @JsonProperty("StartDate")
    private String startDate;
    @JsonProperty("EndDate")
    private String endDate;


    public CourseDetail() {
    }

    public CourseDetail(String courseName, String startDate, String endDate) {
        this.courseName = courseName;
        this.startDate = startDate;
        this.endDate = endDate;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }

}

Json (после запуска кода):

      {
  "course": [
    {
      "course": "course1",
      "StartDate": "16/09/2021",
      "EndDate": "16/09/2022"
    },
    {
      "course": "course2",
      "StartDate": "01/10/2021",
      "EndDate": "01/10/2022"
    },
    {
      "course": "course3",
      "StartDate": "09/09/2021",
      "EndDate": "09/09/2022"
    }
  ]
}

вы можете сделать что-то вроде ниже, используя JacksonAPI,

toJson = objectMapper.readTree(objectMapper.writeValueAsString(от));

Добавьте объект курса в Json и сохраните его.

Другие вопросы по тегам