JAXB/Moxy unmarshalling JSON runs into error Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/json/JsonException

JAXB/Moxy unmarshalling JSON runs into error Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/json/JsonException

我正在尝试 Unmarshal 使用 JAXB/Moxy 将一个简单的 JSON 文件发送到我的 Student POJO,但我 运行 遇到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/json/JsonException
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.getNewXMLReader(SAXUnmarshaller.java:211)
    at com.newJAXB.UnmarshallingJSON.main(UnmarshallingJSON.java:24)
Caused by: java.lang.ClassNotFoundException: jakarta.json.JsonException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

如果我尝试用 XML 替换 JSON 那么一切正常。仅当我 运行 Unmarshalling for JSON file.

时才会出现错误

我只是想知道为什么在 XML 一切正常时我会遇到 JSON 的问题并且我正在按照文章中提到的步骤进行操作。任何帮助将不胜感激。

我有 Jaxb.properties 个文件:

jakarta.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

以下是我的Studentclass:

@XmlRootElement(name = "Student")
@XmlType(name = "Student", propOrder = {"name", "age"})
@XmlAccessorType(XmlAccessType.FIELD)
@ToString(callSuper = true)
@Data
@NoArgsConstructor
public class Student {
    private String name;
    private String age;
}

以下是我的 JSON 文件:

{
  "name": "xyz",
  "age": "25"
}

以下是我的Unmarshalling main class:

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;

import java.io.InputStream;

public class UnmarshallingJSON {
    public static void main(String[] args) throws JAXBException {
        final InputStream inputStream = com.newJAXB.UnmarshallingJSON.class.getClassLoader().getResourceAsStream("student.json");
        JAXBContext jc = JAXBContext.newInstance(Student.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", "application/json");
        unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
        Student student = (Student) unmarshaller.unmarshal(inputStream);
        System.out.println(student);
    }
}

以下是我的依赖:

        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.moxy</artifactId>
            <version>3.1.0-SNAPSHOT</version>
        </dependency>

我只是想知道为什么在 XML 一切正常时我会遇到 JSON 的问题并且我正在按照文章中提到的步骤进行操作。任何帮助将不胜感激。

我在这里尝试了其他帖子上可用的所有方法都没有用,所以发布相同的方法。

我正在关注这些文章: https://dzone.com/articles/eclipselink-moxy-and-java-api http://blog.bdoughan.com/2013/07/eclipselink-moxy-and-java-api-for-json.html

异常实际上告诉你问题所在。您在运行时缺少 class,因此您需要添加依赖项。根据包名和问题描述,我们可以假设您要添加 Jakarta JSON Processing (JSON-P)。尝试添加以下依赖项

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.json</artifactId>
    <version>2.0.1</version>
</dependency>