2013-02-21 69 views
10

我有一個JSON字符串,其中的鍵和值都沒有引號,我想將其轉換爲格式正確的JSON。如何解析不帶引號的JSON字符串

{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}} 

是否有Java庫可以處理它?我試過Jackson但它不起作用。

問候, 揚

回答

4

您可以使用JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES與傑克遜允許不帶引號的字段名稱:

JsonFactory factory = new JsonFactory(); 
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json")); 
+2

我確實使用了它,但它不會對未加引號的數值或未加引號的數字鍵(例如「0:myValue」)有幫助 – Jan 2013-02-21 14:59:57

+1

對於'「許可證」:「一,二」'格式錯誤爲許可證:一,二'你如何選擇解釋?我猜你必須編寫自己的解串器。傑克遜的「ObjectMapper」和「模塊」功能可能會對您有所幫助。 – ipavlic 2013-02-21 15:16:17

+0

就我而言,我知道只有沒有','的字符串作爲值。但是,是的,它看起來像我將不得不編寫我自己的解析器。 – Jan 2013-02-21 15:25:57

0

不知道,如果你有時間寫你自己的解析器或沒有,但我做到了。

https://github.com/ischumacher/rsjp

下面是使用例子你的榜樣JSON:

String str = "{basic:{0:{index:0, license:t, nameSID:n, image:\"img_left\", descriptionSID:t, category:r}}"; 
Map<String, Object> jso = Json.parseJSON(str); 
System.out.println(jso); 
System.out.println(Json.get(jso, "basic", "0", "image")); 

這裏是輸出:

{ 
    basic: 
    { 
     0: 
     { 
     index: 0, 
     license: t, 
     nameSID: n, 
     image: img_left, 
     descriptionSID: t, 
     category: r 
     } 
    } 
} 

img_left 
0

我看着一個會如何定製傑克遜對付非引用字段值(字段名稱)。儘管我最終寫了一篇黑客,但我在這裏發佈了麪包屑足跡供其他人使用。我的代碼spelunking在Jackson 2.7.2中完成。

傑克遜核心自帶JsonParser接口的兩個具體的實現:

  • ReaderBasedJsonParser,對字符流的語法分析程序(編碼 獨立)
  • UTF8StreamJsonParser,對於UTF-8字節優化解析器 流

這兩個類中的代碼是相當多餘的,可能出於必要性。當遇到意外字符時,每個類都有一個由nextToken()調用的方法。 ReaderBasedJsonParser的名稱是_handleOddValue(),UTF8StreamJsonParser的是_handleUnexpectedValue()。像接受「NaN」作爲數值並允許單引號字符串值的東西發生在這裏。

我的計劃(在我開始意識到並意識到一個可怕的黑客就足以滿足我的短期需求)就是將這些解析器中的一個/兩個解析器子類化並覆蓋上面的方法來處理未加引號的字符串值。由於當輸入流處於字段值的上下文中(在識別冒號後),將調用此方法,因此應該可以向前讀取,直到遇到逗號或右大括號,並將讀取到該點的所有內容計爲一個字符串值。由於代碼需要理解Jackson的緩衝策略,解析器的體系結構(當前指向當前緩衝區的指針是一個實例變量)等,因此此代碼編寫起來很棘手。

要使ObjectMapper使用此自定義分析器,子類JsonFactory並用一個實例化它的_createParser()方法重寫。可能需要做更多的工作才能使常規和UTF-8解析器正常工作,但如果性能不是問題,則強制使用常規解析器就足夠了。然後,可以將此自定義JsonFactory的實例傳遞到ObjectMapper的構造函數中。

希望這可以幫助別人。