Mathematica的list of built-in formats相當廣泛;但是,JSON不在該列表中。是否有在Mathematica中生成和解析JSON的現有解決方案,還是我們將不得不推出我們自己的解決方案?解析並生成JSON
11
A
回答
18
UPDATE解析JSON代碼的一個聰明的例子:如Pillsy的回答指出,JSON是一個內置的導入和導出格式的Mathematica 8:http://reference.wolfram.com/mathematica/ref/format/JSON.html。但是,正如在評論中所討論的那樣,以下似乎是Mathematica 10.4.1中更強大的解決方案:
警告:這涉及到做一個eval(ToExpression),所以不要用它來解析來自不受信任的字符串源。
首先,一個真正的快速和骯髒的部分解決JSON解析會是這樣:
ToExpression[StringReplace[json, {"["->"{", "]"->"}", ":"->"->"}]]
也就是說,只需更換方括號花括號和冒號的箭頭,然後EVAL它。 剩下的就是而不是在字符串內部進行這些替換。 (對於空,真,假和科學記數法還需要更多的替換。)
對於非內部字符串問題,可能有更優雅的解決方案,但首先想到的是做替換如"{"->"(*MAGICSTRING*){"
,然後在eval(當字符串外部的註釋將消失時)之後,將這些替換反轉。 (PS:稍後回顧一下,實際上我對它的聰明感到非常滿意,而且它看起來非常健壯。魔術字符串FTW!)
說起來容易做起來難,但下面的JSON解析器似乎工作:
cat = [email protected]@(ToString/@{##})&; (* Like sprintf/strout in C/C++. *)
eval = ToExpression; (* Mathematica function names are too verbose! *)
parseJSON[json_String] := With[{tr = {"[" -> "(*_MAGIC__[__*){",
"]" -> "(*_MAGIC__]__*)}",
":" -> "(*_MAGIC__:__*)->",
"true" -> "(*_MAGIC__t__*)True",
"false" -> "(*_MAGIC__f__*)False",
"null" -> "(*_MAGIC__n__*)Null",
"e" -> "(*_MAGIC__e__*)*10^",
"E" -> "(*_MAGIC__E__*)*10^"}},
[email protected][[email protected]@eval[StringReplace[json, tr]], Reverse/@tr]]
(cat
和eval
是方便的功能簡單cat = ToString
會在這種情況下工作,但我喜歡這一點,會將其所有參數轉換成字符串更一般的版本)。
最後,這裏有一個函數生成JSON(這的確需要更普遍cat
,還有另一個效用函數中的JSON適當的方式顯示數字):
re = RegularExpression;
jnum[x_] := StringReplace[
[email protected][[email protected], ExponentFunction->(Null&)], [email protected]"\\.$"->""]
genJSON[a_ -> b_] := genJSON[a] <> ":" <> genJSON[b]
genJSON[{x__Rule}] := "{" <> cat @@ Riffle[genJSON /@ {x}, ", "] <> "}"
genJSON[{x___}] := "[" <> cat @@ Riffle[genJSON /@ {x}, ", "] <> "]"
genJSON[Null] := "null"
genJSON[True] := "true"
genJSON[False] := "false"
genJSON[x_] := jnum[x] /; NumberQ[x]
genJSON[x_] := "\"" <> StringReplace[cat[x], "\""->"\\\""] <> "\""
2
3
由於數學8,支持導入和導出的JSON is a built-in format。
相關問題
- 1. 解析生成的JSON的問題
- 2. 如何解析JSON模式並創建默認json對象或生成java類?
- 3. 解析JSON成HTML模板
- 4. ajax post成功解析json
- 5. 解析成JSON在node.js中
- 6. JSON解析,並在PhoneGap的
- 7. 解析JSON並不首次
- 8. 試圖JSON解析成swift3並顯示成的UILabel
- 9. symfony1.4解析/生成plist
- 10. 從Firebase解析JSON對象並使用鍵值對生成內容
- 11. ANTLR生成的解析器產生MissingTokenException
- 12. C#JSON解析。解析轉義JSON
- 13. 生成特定JSON格式的Python解析器
- 14. 從JavaScript生成的Cookie解析JSON字符串
- 15. 的Javascript無法解析JSON由ObjectMapper對象生成
- 16. JSON解析生成url編碼的字符串
- 17. 解析動態生成的url和更多的json文件
- 18. 使用GSON解析JSON(通過分形生成)
- 19. 在json解析中發生異常
- 20. iOS JSON解析成NSDictionary,然後用SBJson解析NSArray
- 21. JSON解析不解
- 22. 春RestTemplate,攔截響應解析成JSON
- 23. 如何解析它們變成JSON
- 24. 解析json使用ajax成功函數
- 25. 無法解析JSON成一個ListView
- 26. 從JQuery.ajax成功數據解析JSON
- 27. 如何解析JSON陣列成POJO
- 28. 在C#子成員中解析JSON
- 29. 解析JSON成大熊貓數據幀
- 30. Python:如何解析JSON成員名
@Pillsy,讓我們知道這是否適用於您,或者如果您發現任何錯誤或進行改進。你的回答對我來說是非常有幫助的,所以我很想報答你的恩惠! – dreeves 2010-04-15 21:22:16
我現在正在使用這個版本,所以在這一點上它的測試合理。請注意剛剛修復的錯誤! – dreeves 2011-02-24 21:49:14
Mathematica 8原則上可以爲JSON提供導入功能,但是它拒絕加載一個簡單的小型18 MB .json文件(它永遠在運行)。你的功能就像一個魅力。謝謝。 – phantomas1234 2011-10-28 23:12:01