0

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

JsonObjects 是“不可变的”,尽管有 Map 类的支持,这意味着我不应该修改它们。

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

然而 JsonObjectBuilder 似乎实现了一个“只写”接口——你可以把东西放在那里,但你永远不能读它们(不是子类映射或任何东西吗?),所以如果你把 ArrayBuilder 放在那里,你有如果您以后想要添加到它,请跟踪它(因为没有办法“读取”数组构建器并且......)

所以接缝有两个接口,一个是只读的,一个是只写的,唯一可能的转换是只写到只读,没有回头路,也没有办法读/写 JSON 结构。

我觉得我错过了一些非常明显的东西......

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

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

(是的,我确实尝试过谷歌搜索,我想出的任何东西都没有帮助,这让我更加困惑......)

4

1 回答 1

1

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

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

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

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

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

这根本不是肮脏的解决方案。接收者收到一个String并且需要将该字符串解析为他自己的域模型,对那个对象做任何他喜欢做的事情,并且可能在将他分派到其他地方之前再次将该对象字符串化给第三个接收者。

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

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

于 2013-10-10T19:22:42.220 回答