搜索将对象之间的双向链接转换为 JSON 格式的正确方法

2023-12-07

我一直在寻找正确的方法来转换我的Student对象(带有嵌套Marks反对JSON format.

我尝试将获取类型组合为LAZY and EAGER,但这无济于事。得到StackOverflowException.

一段时间后,我找到了一个解决方案 - >使用注释@JsonIgnore嵌套中Marks对象,并把Students and Marks反对JSON分别作为下一个字符串:

String jsonStringStud = new ObjectMapper().writeValueAsString(student);
String jsonStringMarks = new ObjectMapper().writeValueAsString(student.getCtlgMarks());

之后我必须添加Marks代替Students,但我怀疑这是不好的做法。

这是我的期望:

String jsonStringStud = new ObjectMapper().writeValueAsString(student);

预期输出:Students{studentId=1, StudentName=Alex, ctlgMarks=Marks{marksId=1, markValue=Bad}}

您能否查看我的代码,并让我知道是否有正确的方法将我的对象转换为JSON format?

如果您编写“类似的”代码或之前/之后的代码,这将非常有帮助。

这是我的代码:

Table Student

CREATE TABLE "student" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "name"  NVARCHAR NOT NULL UNIQUE,
    "marks_fk"  INTEGER NOT NULL,
    FOREIGN KEY("marks_fk") REFERENCES "ctlg_marks"("id")
);

Table Marks

CREATE TABLE "ctlg_marks" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "mark_value"    NVARCHAR NOT NULL UNIQUE
);

Entity Students

package entities;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@Entity
@Table(name = "student")
@JsonPropertyOrder({"id","name","ctlgMarks"})
public class Students implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int studentId;

    @Column(name = "name")
    private String studentName;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "marks_fk")
    @JsonIgnore
    private Marks ctlgMarks = new Marks();

    public Students() {
    }

    @Override
    public String toString() {
        return "Students{" + "studentId=" + studentId + 
                ", studentName=" + studentName + 
                ", ctlgMarks=" + ctlgMarks + '}';
    }


}

Entity Marks

package entities;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.Cascade;

@Getter
@Setter
@AllArgsConstructor
@Entity
@Table(name = "ctlg_marks")
public class Marks implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int marksId;

    @Column(name = "mark_value")
    private String markValue;

    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @OneToMany(mappedBy = "ctlgMarks", fetch = FetchType.LAZY)
    private Set<Students> students = new HashSet<>();

    public Marks() {
    }

    @Override
    public String toString() {
        return "Marks{" + "marksId=" + marksId + 
                ", markValue=" + markValue + '}';
    }
}

这是我用来获取的方法Student通过 id 获取对象并将其转换为JSON.

public String readWithinSession(int id) {

Students student = new Students();
String str = "";

SessionFactory factory1 = new Configuration()
        .configure("hibernate.cfg.xml")
        .addAnnotatedClass(Students.class)
        .buildSessionFactory();

Session session = factory1.getCurrentSession();

try {
    session.beginTransaction();

    student = session.get(Students.class, id);

    if (student != null) {
        Hibernate.initialize(student.getCtlgMarks());
        System.out.println("INITIALIZE USED");
    }

//分别获取student和marks的json格式字符串

            try {
                String jsonStringStud = new ObjectMapper().writeValueAsString(student);
                String jsonStringMarks = new ObjectMapper().writeValueAsString(student.getCtlgMarks());

/*
After getting json student string: {"studentId":1,"studentName":"Alex"}
After getting json marks string: {"marksId":1,"markValue":"Bad","students":[{"studentId":1,"studentName":"Alex"}]}
*/


//Separately get objects student and marks



                try {

                    Students studObj = new ObjectMapper().readValue(jsonStringStud, Students.class);
                    Marks marksObj = new ObjectMapper().readValue(jsonStringMarks, Marks.class);

                    System.out.println("After got stud obj from string: " + studObj);
                    System.out.println("After got marks obj from string: " + marksObj);



/*
After getting stud obj from json string: Students{studentId=1, studentName=Alex, ctlgMarks=Marks{marksId=0, markValue=null}}
After getting marks obj from json string: Marks{marksId=1, markValue=Bad}
*/


//Join marks to student
                    studObj.setCtlgMarks(marksObj);
                    System.out.println("Student after got marks object" + studObj);

/*
Student after got marks objectStudents{studentId=1, studentName=Alex, ctlgMarks=Marks{marksId=1, markValue=Bad}}
*/

                } catch (IOException ex) {
                    Logger.getLogger(StudentsDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
                }

            } catch (JsonProcessingException ex) {
                Logger.getLogger(Domain.class.getName()).log(Level.SEVERE, null, ex);
            }

            session.getTransaction().commit();

        } finally {
            factory1.close();
        }
        return str;
    }

你应该使用JsonBackReference注解。我仅将您的代码简化为Jackson注释以显示其工作原理。模型:

@JsonPropertyOrder({"studentId", "studentName", "ctlgMarks"})
class Students {

    private int studentId;
    private String studentName;
    private Marks ctlgMarks;

    // getters, setters, constructors
}

class Marks {

    private int marksId;
    private String markValue;

    @JsonBackReference
    private Set<Students> students;

    // getters, setters, constructors
}

用法示例:

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        Marks marks = new Marks();
        Students student0 = new Students(1, "Rick", marks);
        Students student1 = new Students(2, "Morty", marks);

        marks.setMarksId(1);
        marks.setMarkValue("Value");
        marks.setStudents(new HashSet<>(Arrays.asList(student0, student1)));

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        System.out.println(mapper.writeValueAsString(student0));
        System.out.println(mapper.writeValueAsString(student1));
        System.out.println(mapper.writeValueAsString(marks));
    }
}

上面的代码打印出来。学生1:

{
  "studentId" : 1,
  "studentName" : "Rick",
  "ctlgMarks" : {
    "marksId" : 1,
    "markValue" : "Value"
  }
}

学生2:

{
  "studentId" : 2,
  "studentName" : "Morty",
  "ctlgMarks" : {
    "marksId" : 1,
    "markValue" : "Value"
  }
}

Marks:

{
  "marksId" : 1,
  "markValue" : "Value"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索将对象之间的双向链接转换为 JSON 格式的正确方法 的相关文章

  • Java中的文字赋值[重复]

    这个问题在这里已经有答案了 定义上有什么区别 double example 23 1d or double example 23 1 为什么long float double可以以l f d结尾 之间没有区别double example 2
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • Active MQ - HelloWorld 示例异常

    我正在尝试运行 hello world 示例在这里找到 http activemq apache org hello world html I added activemq all 5 5 1 jar已经到图书馆了 它构建成功 但出现以下警
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • JSON 语法:传输数组

    A validJSON 语法是这样的 username admin password 123 但是如果我想传输一组 用户 给出的例子 而不是单个 用户 根据规范 下面的代码是有效的 JSON 吗 username admin passwor
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 在 Java 中创建带注释的对象时收到通知

    Intent 我有一个自定义 Java 注释 DynamicField public class RESTEndpointInvoker DynamicField key httpTimeout private long httpTimeo
  • selenium webdriver 中的多个程序执行不起作用

    Selenium WebDriver 中的多个程序执行不起作用 我编写了 1 个 testNG xml 文件和 2 个 java 类 我尝试从 xml 文件运行这两个 java 类 但这不起作用 XML代码
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • Elasticsearch - EdgeNgram + 突出显示 + term_vector = 不好的突出显示

    当我使用带有edgengram min 3 max 7 front term vector with positions offsets的分析器时 文档包含文本 CouchDB 当我搜索 couc 时 我的亮点是 cpu 而不是 couc
  • 获取包中声明的所有 Java 类的名称

    我正在编写一个功能 它将有助于将类放入我的程序的某个包中 另外 我只想要子类某个类的类 我需要这些类才能调用它们的静态方法 有没有一种自动的方法来做到这一点 如果是的话 速度慢吗 如果我不清楚 我想要的是这样的 ArrayList
  • 春季MVC。方法参数字段的默认值

    我有一个带有方法测试的简单控制器 RequestMapping produces application json ResponseBody public HttpEntity
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • 如何在 Log4j2 - JSON 布局中自定义或删除默认属性

    In Spring Boot 2我已配置的应用程序Log4j2 with JsonLayout像下面这样
  • 如何创建具有同等时间元素的 JavaFX 转换?

    我正在尝试 JavaFX 和动画 尤其是PathTransition 我正在创建一个简单的程序 使球 弹跳 而不使用QuadCurveTo班级 到目前为止 这是我的代码 Ellipse ball new Ellipse 375 250 10

随机推荐