如何使用JSON-B将JSON字符串反序列化为非公共类?

问题描述 投票:3回答:1

我创建了一个简单的Java 9 Maven应用程序,其中包含两个类,以使用JSON-B测试JSON的序列化和反序列化。这是代码:

package com.jsonbdemos;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;

public class App {

    public static void main(String[] args) {
        Jsonb jsonb = JsonbBuilder.create(new JsonbConfig());
        String jsonData = "{\"creationDate\":\"2018-01-05\"}";

        // Create Widget object from JSON string.
        Widget widget = jsonb.fromJson(jsonData, Widget.class);
        System.out.println("JSON => object: " + widget.toString());

        // Serialize Widget object to JSON string.
        String jsonFromObject = jsonb.toJson(widget);
        System.out.println("object => JSON: " + jsonFromObject);
    }
}

package com.jsonbdemos;
import java.time.LocalDate;

public class Widget { // IllegalAccessException if "public" is removed.
    private LocalDate creationDate;
    public Widget() {}

    @Override
    public String toString() { return "creationDate=" + creationDate; }
    public LocalDate getCreationDate() { return creationDate; }
    public void setCreationDate(LocalDate creationDate) { this.creationDate = creationDate; }
}

pom.xml中的JSON-B(Eclipse Yasson)参考实现的最新版本具有依赖性:

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.json</artifactId>
  <version>[1.1.2,)</version>
</dependency>
<dependency>
  <groupId>javax.json.bind</groupId>
  <artifactId>javax.json.bind-api</artifactId>
  <version>[1.0,)</version>
</dependency>
<dependency>
  <groupId>org.eclipse</groupId>
  <artifactId>yasson</artifactId>
  <version>[1.0.0,)</version>
</dependency>

该应用程序运行正常,但是如果我将类Widget的访问级别从public更改为空(即“ package private”),调用Jsonb.fromJson()

时抛出IllegalAccessException。

线程“主”中的异常javax.json.bind.JsonbException:无法在创建实例org.eclipse.yasson.internal.ReflectionUtils.lambda $ createNoArgConstructorInstance $ 1(ReflectionUtils.java:191)在java.base / java.security.AccessController.doPrivileged(本机方法)org.eclipse.yasson.internal.ReflectionUtils.createNoArgConstructorInstance(ReflectionUtils.java:186)在org.eclipse.yasson.internal.serializer.ObjectDeserializer.getInstance(ObjectDeserializer.java:92)在org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserialize(AbstractContainerDeserializer.java:62)在org.eclipse.yasson.internal.Unmarshaller.deserializeItem(Unmarshaller.java:57)在org.eclipse.yasson.internal.Unmarshaller.deserialize(Unmarshaller.java:50)在org.eclipse.yasson.internal.JsonBinding.deserialize(JsonBinding.java:45)在org.eclipse.yasson.internal.JsonBinding.fromJson(JsonBinding.java:52)在com.jsonbdemos.App.main(App.java:15)原因:java.lang.IllegalAccessException:类org.eclipse.yasson.internal.ReflectionUtils无法访问以下成员带有修饰符“ public”的com.jsonbdemos.Widget类java.base / jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)在java.base / java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:589)在java.base / java.lang.reflect.Constructor.newInstance(Constructor.java:479)在org.eclipse.yasson.internal.ReflectionUtils.lambda $ createNoArgConstructorInstance $ 1(ReflectionUtils.java:189)...另外9个

我在规范(JSR 367:"JSON-B: Java™ API for JSON Binding")中没有看到任何内容(在[[3.7 Java类]中的部分]),需要使用公共类进行反序列化。 关于如何使用JSON-B反序列化为不公开的类实例的任何建议?

更新(5/2/18):

JSR 367指出“

传递给反序列化操作的任何实例都必须具有公共或受保护的无参数构造函数

”,但是,如果构造函数为protected而不是公开
我已经报告了该问题:Deserialization still not working with a protected no-arg constructor #118

我创建了一个简单的Java 9 Maven应用程序,其中包含两个类,以使用JSON-B测试JSON的序列化和反序列化。这是代码:package com.jsonbdemos;导入javax.json.bind.Jsonb; ...

java json json-deserialization jsonb-api
1个回答
2
投票
我测试了以下结果的一些变体:
© www.soinside.com 2019 - 2024. All rights reserved.