2013-10-02 39 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