首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java-EE 7 Json规范-读/写功能?

Java-EE 7 Json规范-读/写功能?
EN

Stack Overflow用户
提问于 2013-10-03 06:06:05
回答 1查看 362关注 0票数 0

刚开始使用JSON reference library (http://docs.oracle.com/javaee/7/api/javax/json/package-summary.html)编写一些代码,遇到了一个简单的问题。使用一个简单但“丑陋”的解决方案。

JsonObjects是“不可变的”,尽管有一个Map类作为后盾,这意味着我不应该修改它们。

我想非常动态地构造一个对象,比如说,获取一个数组并向其添加一个元素,一个完整的“读/写”模型。

然而,JsonObjectBuilder似乎实现了一个“只写”接口--您可以在其中放入内容,但永远不能读取它们(没有子类映射或其他内容吗?),所以如果您在其中放入一个ArrayBuilder,那么如果您以后想要添加它,就必须跟踪它(因为没有办法“读”回数组构建器并……)

所以看起来有两个接口,一个是只读的,另一个是只写的,唯一可能的转换是只写到只读,没有退路,也没有读/写JSON结构的方法。

我觉得我遗漏了一些很明显的东西。

显而易见的“脏”解决方案当然是将数据存储在我自己的结构中,然后在构建时将其转换为JSON构建器,尽管这对需要修改它并传递它的JSON的接收者并没有真正的帮助。我的对象和它之间的双向接口,或者将只读的json(递归地)转换回构建器并在过程中修改它的转换器……

我遗漏了什么?为什么我似乎必须构建自己的JSON表示,并将其传入和流出RO / WO模型?

(是的,我确实尝试过谷歌搜索,但我没有找到任何有用的东西,这让我更加困惑……)

EN

回答 1

Stack Overflow用户

发布于 2013-10-11 03:22:42

是的,JsonObjectBuilder用于在JsonObject中写入您想要最终确定的所有数据。当您构建了JsonObject之后,您很可能希望通过调用他的toString()方法来序列化他以便通过HTTP进行传输。然后,在另一端,如果接收方是Java,那么您很可能希望使用JsonReader并开始相反的过程。

我认为你“错过”的东西可能是你设计中的一个缺陷。为什么另一个实体需要改变已经写入JsonObjectBuilder的内容?这不是意味着你的第一个实体的任务失败了吗?

JSON API与我构建自己的构建器类的方式非常相似。它们只公开setter方法,而不公开getter方法。这就是构建最终产品的目的。字段的状态/值已经从外部源传递给构建器。因此,在很大程度上,我们可以安全地假设“不需要”getter。如果我们也添加getter,它们将污染API,使其变得两倍大。我的构建器甚至不允许连续调用setter,相反,如果有人试图在已经写入的字段中输入值,它们就会抛出IllegalStateException。尽最大努力保持对象的不可变性是线程安全的金科玉律。简单地说,对于不可变对象,您不需要同步或其他并发机制。构建器通常是实现不变性的主要设计模式。

如果我错了,请纠正我,但是您正在尝试构建的JSON对象不是已经由域模型支持了吗?假设您有一个Person类,并且希望使用JSON语法将其字符串化为字符串?在这种情况下,您不需要构建JSON字符串,直到他准备好被远程分派到某个地方。或者就像你自己说的那样:

显而易见的“脏”解决方案当然是将数据存储在我自己的结构中,然后在构建时将其转换为JSON builder……

这根本不是一个肮脏的解决方案。接收方接收到一个String,并且需要将该字符串解析为他自己的域模型,对该对象执行任何他喜欢的操作,并且可能在将该对象发送到第三个接收方之前再次将该对象串化。

如果接收方驻留在同一个Java VM中,那么为什么需要使用JSON呢?

我觉得我可能对你帮助不大,但如果是这样的话,请更新你的帖子,更详细地描述你的问题,我会带着我的想法回复你的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19147618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档