问题标签 [jsonb-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
703 浏览

java - JSR-367:如何将简单的 json 绑定到对象并提取数据

如何将json文件绑定到对象。这里我使用JSR-367 API,yasson实现来实现。

JSON 文件如下所示

对于上面的 json,我创建了两个 Binding 类,它们
是针对json.

1.

这是针对Details数组
2)

json这是将类从文件绑定到对象的主要类

帮助我为给定json文件编写绑定类。

0 投票
2 回答
6402 浏览

jakarta-ee - 如何使用 json-b 反序列化接口?

我正在改编这个杰克逊代码:

原始代码运行良好,即使对于嵌套的 Entity 对象也是如此。

如何对新的 json-b 规范做同样的事情?我尝试使用 @JsonbTypeDeserializer 但是

  1. 这真的是要走的路吗?它似乎缺乏仅指定一个类的简单性。
  2. 它似乎不适用于嵌套实体,这是我最大的问题:

    javax.json.bind.JsonbException:无法推断解组为的类型:实体

  3. 实体上未拾取注释。我必须使用 JsonbConfig::withDeserializers 手动添加。

这是我的反序列化代码:

非常感谢任何提示或帮助:-)

0 投票
1 回答
1811 浏览

jakarta-ee - 如何拒绝使用 JSON-B 对无法识别的属性进行反序列化

我正在尝试迁移一些 JSON 数据绑定代码的实现细节以使用 Java EE 8 JSON-B API 而不是 Jackson。

为了匹配 Jackson 的默认行为,当 JSON 有效负载包含无法识别的属性时,我想拒绝将 JSON 有效负载反序列化为 POJO 的任何尝试。

例如,如果我有以下 JSON 数据:

我有以下 Java 对象,将这些数据建模为:

我将如何拒绝将上述 JSON 数据绑定到上述 POJO 的尝试?

如果我尝试以下操作,Thing对象将被创建而没有错误(这里我希望发生错误):

0 投票
1 回答
1017 浏览

java - jsonb:Jsonb 不调用嵌套序列化

新标签请求:java-ee-8

它有一个新功能,称为 jsonb。使用 jsonb,我无法让嵌套序列化工作。请参阅下面打印的粗体。

所以,我写了一个 jaxrs 应用程序。这个应用程序有一个使用 jsonb 的 messagebodywriter:

ApiResponseDto 如下所示:

ResponseStatus 是一个枚举,可以通过上面的 TypeAdapter 进行序列化。对于这个类,我编写了 ApiResponseDtoSerializer。

现在 Optional data() 应该包含一个 QueryParamEntry 的 ImmutableSet,如下所示:

类型适配器是这个:

最终输出为:

如您所见,嵌套序列化不起作用。Jsonb 似乎找到了正确的类型(因为否则它根本不会序列化对象)。但即使是我的 SerializerClass 中的日志语句也不会被调用。

顺便说一句:你需要 Guava 22 和 immutables.github.io 来编译这段代码,显然还有 slf4j:

0 投票
1 回答
3463 浏览

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

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

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

该应用程序运行良好,但如果我将类Widget的访问级别从公共更改为无(即“包私有”),则在调用Jsonb.fromJson()时会引发 IllegalAccessException :

线程“主”javax.json.bind.JsonbException 中的异常:无法在 java.base/java.security 的 org.eclipse.yasson.internal.ReflectionUtils.lambda$createNoArgConstructorInstance$1(ReflectionUtils.java:191) 创建实例。 AccessController.doPrivileged(Native Method) 在 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。反序列化(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) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:589) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:479) at 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 声明“任何传递给反序列化操作的实例都必须有一个公共或受保护的无参数构造函数”,但如果构造函数是受保护的而不是公共的,也会发生同样的错误。

我已经报告了这个问题:反序列化仍然无法使用受保护的无参数构造函数 #118

0 投票
1 回答
772 浏览

jakarta-ee - JAX-RS 2.1:意外时应用 JSON-B 适配器

问题:

给定 REST 端点:

提交PUT请求后,JAX-RS 预计会返回更新后的公司,例如

但是,只1返回主键 , 。第二个请求触发异常:

尽管我没有要适应的公司,但似乎已应用了适配器

语境

配置是:

  • Payara 5.0.0.Alpha3(因此是 Yasson 1.0)
  • Java EE 8(因此是 JAX-RS 2.1、JSON-B 1.0 和 JSON-P 1.1)
  • 应用程序以 EAR 格式打包
  • 使用 Postman 提交的 REST 请求

两个实体CompanyDepartment通过@OneToMany关系链接。两个实体都有一个主键id和一个名称name。为了避免 JSON 无限循环,@ManyToOne公司的部门有一个适配器:

使用(简化的)适配器:

解决方法:

最初,我认为一旦定义了适配器,它们就会被应用到任何地方,类似于带有autoApply = true. 这让我无处可去

起初,我考虑使用 Yasson 的最新版本(1.0.2-SNAPSHOT)来解决这个问题。为此,我需要告诉 Payara 加载我想要的 Yasson。所以glassfish-web.xml修改如下:

根据Payara 文件

但似乎仅将class-loader授权切换为 false 就足够了。

=> 为什么?

附属问题:

由于一些热部署问题,我需要执行以下操作来测试我的更改:

  1. 做出改变
  2. 构建和部署
  3. 部署后重启服务器

如果有人知道为什么热部署/简单部署会修改 JAX-RS 适配器行为,我期待答案

0 投票
1 回答
70 浏览

java - JSON-B 和 JSON API 之间缺少桥梁?

我正在尝试实现一个将 JSON-PATCH (RFC 6902) 应用于使用 JSON-B 注释的对象的函数。

我得出了以下解决方案:

这种方法的问题在于过程中发生的序列化/反序列化的数量,更不用说实现不流畅。

我是否遗漏了 API 中的某些内容以简化此修补功能的实现,或者仅仅是 JSON-B 和 JSON 之间缺少一座桥梁,例如:

0 投票
2 回答
1305 浏览

java - 如何在 android studio 中导入 javax.json.binding?

我在 build.gradle 文件中添加了以下依赖项

编译 'javax.json.bind:javax.json.bind-api:1.0.0-M2' 它会抛出类似的错误

错误:任务“:app:transformClassesWithDesugarForDebug”执行失败。

com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: 使用主类 com.google.devtools 执行 java 进程时出错。 build.android.desugar.Desugar 带参数 {--input /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/11.jar --output /Users/panmoh/Documents/AndroidMockUps/app /build/intermediates/transforms/desugar/debug/10.jar --input /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/6.jar --output /Users/panmoh/Documents /AndroidMockUps/app/build/intermediates/transforms/desugar/debug/5.jar --input /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/19。jar --output /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/desugar/debug/18.jar --input /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/ debug/18.jar --output /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/desugar/debug/17.jar --input /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/ transforms/stackFramesFixer/debug/26.jar --output /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/desugar/debug/21.jar --input /Users/panmoh/Documents/AndroidMockUps/app/ build/intermediates/transforms/stackFramesFixer/debug/4.jar --output /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/desugar/debug/3.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/classes/debug --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/0.jar - -classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/3.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/ 4.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/5.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/ stackFramesFixer/debug/6.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/7。jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/8.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/ debug/9.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/10.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/ transforms/stackFramesFixer/debug/11.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/12.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/ build/intermediates/transforms/stackFramesFixer/debug/13.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/14。jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/15.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/ debug/16.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/17.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/ transforms/stackFramesFixer/debug/18.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/19.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/ build/intermediates/transforms/stackFramesFixer/debug/20.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/21。jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/debug/26.jar --classpath_entry /Users/panmoh/Documents/AndroidMockUps/app/build/intermediates/transforms/stackFramesFixer/ debug/27.jar --bootclasspath_entry /Users/panmoh/Library/Android/sdk/platforms/android-26/android.jar --bootclasspath_entry /Users/panmoh/Library/Android/sdk/platforms/android-26/optional/ org.apache.http.legacy.jar --bootclasspath_entry /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/resources.jar --bootclasspath_entry /Applications/Android Studio.app/Contents/ jre/jdk/Contents/Home/jre/lib/rt.jar --bootclasspath_entry /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jsse.jar --bootclasspath_entry /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/jce。jar --bootclasspath_entry /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/charsets.jar --min_sdk_version 15 --desugar_try_with_resources_if_needed --desugar_try_with_resources_omit_runtime_classes}

这是我的 build.gradle 文件

0 投票
3 回答
415 浏览

java - JSON-B REST 有效负载验证

我开发了一个 Java REST 服务,使用 JSON-B 将传入的有效负载映射到 POJO。

现在我想做的是验证传入的有效负载,可能是针对 JSON 模式,但到目前为止我还没有找到任何这种意义上的东西......

是否可以覆盖默认的 JSON-B 映射过程,从而捕获任何映射异常并自行处理?

0 投票
1 回答
2600 浏览

java - 使用 JSON-B 将 UUID 序列化为 JSON 中的规范十六进制字符串

UUID

通用唯一标识符 (UUID)是一个 128 位的值。在 Java 中由java.util.UUID类表示。

十六进制字符串

为了显示和序列化,它被规范地格式化为 36 个字符的十六进制字符串,以连字符分隔的五组排列。例如
fd95cb46-8ec3-11e8-9eb6-529269fb1459

当使用 Java 标准的 XML 和 JSON API 进行序列化时,我期望这个十六进制字符串。适用于 XML,但不适用于 JSON。我没有为 XML 或 JSON 使用任何类型的注释。我的简单POJO对XMLJSON一无所知。

XML = 成功

当我使用JSR 222: JavaTM Architecture for XML Binding (JAXB) 2.0的标准 XML 绑定框架生成 XML 时,成功了。我按预期得到了十六进制字符串。请参阅此片段的最后一个元素:

JSON = 失败

当我通过JSR 367panel的标准 JSON 绑定框架运行同一对象时:JavaTM API for JSON Binding (JSON-B)失败。我得到的是数字,而不是预期的十六进制字符串。

如果滚动,您将看到命名的 UUIDid显示为一对数字而不是十六进制字符串:

"id":{"leastSignificantBits":-5323841289984462261,"mostSignificantBits":-8515942329042973684}

有没有办法让 JSON 绑定像 XML 绑定一样工作?我想要十六进制字符串,而不是一对 64 位数字。

当然,这个编组的值在解组时应该可以工作,重新水合到 Java 对象中。