2013-10-02 42 views
0

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

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

我想非常动态地构造一个对象,比如说,接受一个数组并为它添加一个元素,一个完整的“读/写”模型。但是JsonObjectBuilder似乎实现了“只写”接口 - 你可以把东西放在那里,但你永远不会读它们(不会继承map或任何东西?),所以如果你把一个ArrayBuilder放入在那里,如果你以后想要添加它,你必须跟踪它(因为没有办法'读'阵列构建器退出......)

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

我觉得我失去了一些东西很明显...

明显的“脏”的解决办法当然是将数据存储在自己的结构,然后将其转换为JSON建设者在构建时,寿这对于需要对其进行修改并将其传递给JSON的接收器并没有什么帮助。我的对象和它之间的双向接口,或转换器只读json's(递归地)返回到构建器并在此过程中修改它...

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

(是的,我曾尝试使用Google,什么我想出了是有帮助的,这进一步混淆我...)

回答

1

是的,JsonObjectBuilder是用来写所有你想要的JsonObject完成的数据。当你建立了JsonObject时,你很可能想要通过调用他的toString()方法来序列化他通过HTTP传输。然后在另一端,如果接收者是Java VM,那么您很可能会想要使用JsonReader并开始反转该过程。

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

JSON API非常类似于我如何构建自己的构建器类。他们只暴露了setter方法,而不是getter。这就是最终产品的目的。领域的状态/价值已经从外部来源带给建设者。因此,我们大多数人可以安全地假设吸气者没有“需要”。如果我们也添加getter,他们会污染API,使其成倍增长。我的建设者甚至不会允许连续调用setter,如果有人试图向已经写入的字段添加一个值,他们会抛出一个IllegalStateException。尽最大努力让对象保持不变是线程安全的黄金法则。简单地说,你不需要用于不可变对象的同步或其他并发机制。建筑商通常是实现不变性的主要设计模式。

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

明显的“脏”的解决方法当然是把数据存储在自己的 结构,然后将其转换为JSON建设者在构建时[..]。

这完全没有肮脏的解决方案。接收者收到一个String,并且需要将该String解析为他自己的领域模型,对该对象做任何他喜欢的事情,并且可能在将对象派遣到第三个接收者之前再次对其进行字符串化。

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

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

+0

嗨,哟,怕没太大用处。我打算构建一个基本上是大型组件链,现在所有的java,并且大多是“本地”的系统,但最终远程任务可以加入其他语言...... JSON似乎是一种很好的“消息格式” ,灵活的等等......除了能够本地处理动态的JSON对象,在一天结束时的大问题似乎是这样的: 如果我收到一条JSON消息,而我的工作只是添加一个元素到某处然后传递JSON消息,为什么我不得不解构整个数据结构并重建? – iain

+0

感谢您回复寿,没有人甚至设法说“是的,不行!”。我在另一种语言(第二人生的LSL)中使用了JSON,其中原生数据结构非常糟糕,实际上只是在JSON中存储“状态”,因为它传递的代码部分非常好,在已经传递的系统中它在很多代码,系统和语言之间,为什么要反序列化/连续两次? “序列化表单” - > JSON对象表单 - >我的数据结构 - > JSON生成器 - >序列化表单。我只能在“我的数据结构”中进行修改。看起来故意效率低下。 – iain

+0

(特别是,如果我必须编写自己的代码,将JSONObjects解密到/解密到我的数据类中,然后将它们重新编码为JSONBuilder,仅用于使用其序列化/反序列化......并且它的内部数据结构就是我需要的一切,建立这样一个转换器接口的唯一原因是因为我被迫......没有关于我从这一步获得的设计好处,我间接实现了相同的目标,所以最终目标不能实现是“不可能的错误”......所以为什么这么强制) – iain