2013-06-27 101 views
2

我有從json導入的非常大的結果集。 json中的每一行數據都會返回一個非常特定的「列」順序,我希望快速迭代。我寧願避免檢查/匹配鍵的開銷來處理每一塊數據。不幸的是,scala.util.parsing.json將這些列放入一個Map對象中,當遍歷Map時,它迭代的順序是隨機的,並且不一定反映JSON結果中列的順序。有沒有辦法讓解析器執行JSON列的順序?一個想法是,如果有方法告訴解析器使用LinkedHashMap或ListMap,因爲它正在生成對象。這可以通過擴展課程或添加其他特徵來實現嗎?我有其他選擇嗎?強制執行JSON結果的順序

+1

如果您的問題中包含「寧願避免開銷」一詞,您可能希望避免使用'scala.util.parsing.json'。 –

回答

1

我會考慮嘗試類似json4s的東西。

看來JObject類型已經排序了字段。

https://github.com/json4s/json4s

否則我會問,爲什麼你需要他們定購? 您可以隨時使用map.get按鍵。

+0

json4s看起來像它可能是有希望的,但我需要找到一種方法來強制所有字段被解析爲字符串(例如長字符串的數字不會被解析爲雙) –

+0

我使用的是光滑的DB框架,並且將這些價值觀傾倒在準備好的聲明中。填充預準備語句使用數字索引來處理每個變量映射。鑑於我可以爲每個鍵名創建一個查找表給它各自的索引,但我寧願不處理維護這樣一個表的開銷,以及在每個結果行上執行該操作的處理能力。 –

+0

字符串字段包含在json中的雙引號中。 json4s會給你正確的類型。 – JasonG

2

我強烈建議您不要依賴鍵/值對的順序。 JSON對象爲defined,如下所示:

對象是無序的一組名稱/值對。

依靠訂單很可能會引入難以解決的錯誤和代碼不兼容。交易對速度的正確性總是一件壞事。

相反,我會建議找到一個快速,正確的解析器。我以前使用過Jackson,這非常快,可以很好地與Scala一起使用。你annotate你的任意類和傑克遜解析JSON到類的實例。然後,您可以將這些實例作爲本機Java/Scala對象來處理,這些對象都非常快速並且非常健壯。

+0

Jackson是一個基於Java的庫。有一個名叫Jerkson的包裝紙,被玩家使用!框架一段時間。儘管其他圖書館越來越受歡迎,但該項目已被放棄。 Json4s可以得到傑克遜的支持,所以我建議在scala中使用它。 – JasonG

+0

jackson還有一個scala模塊,它可以使java庫與scala對象一起工作 - > https://github.com/FasterXML/jackson-module-scala –