我有一個JSON字符串,其中的鍵和值都沒有引號,我想將其轉換爲格式正確的JSON。如何解析不帶引號的JSON字符串
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}
是否有Java庫可以處理它?我試過Jackson但它不起作用。
問候, 揚
我有一個JSON字符串,其中的鍵和值都沒有引號,我想將其轉換爲格式正確的JSON。如何解析不帶引號的JSON字符串
{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}}
是否有Java庫可以處理它?我試過Jackson但它不起作用。
問候, 揚
您可以使用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"));
不知道,如果你有時間寫你自己的解析器或沒有,但我做到了。
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
我看着一個會如何定製傑克遜對付非引用字段值(字段名稱)。儘管我最終寫了一篇黑客,但我在這裏發佈了麪包屑足跡供其他人使用。我的代碼spelunking在Jackson 2.7.2中完成。
傑克遜核心自帶JsonParser接口的兩個具體的實現:
這兩個類中的代碼是相當多餘的,可能出於必要性。當遇到意外字符時,每個類都有一個由nextToken()調用的方法。 ReaderBasedJsonParser的名稱是_handleOddValue(),UTF8StreamJsonParser的是_handleUnexpectedValue()。像接受「NaN」作爲數值並允許單引號字符串值的東西發生在這裏。
我的計劃(在我開始意識到並意識到一個可怕的黑客就足以滿足我的短期需求)就是將這些解析器中的一個/兩個解析器子類化並覆蓋上面的方法來處理未加引號的字符串值。由於當輸入流處於字段值的上下文中(在識別冒號後),將調用此方法,因此應該可以向前讀取,直到遇到逗號或右大括號,並將讀取到該點的所有內容計爲一個字符串值。由於代碼需要理解Jackson的緩衝策略,解析器的體系結構(當前指向當前緩衝區的指針是一個實例變量)等,因此此代碼編寫起來很棘手。
要使ObjectMapper使用此自定義分析器,子類JsonFactory並用一個實例化它的_createParser()方法重寫。可能需要做更多的工作才能使常規和UTF-8解析器正常工作,但如果性能不是問題,則強制使用常規解析器就足夠了。然後,可以將此自定義JsonFactory的實例傳遞到ObjectMapper的構造函數中。
希望這可以幫助別人。
我確實使用了它,但它不會對未加引號的數值或未加引號的數字鍵(例如「0:myValue」)有幫助 – Jan 2013-02-21 14:59:57
對於'「許可證」:「一,二」'格式錯誤爲許可證:一,二'你如何選擇解釋?我猜你必須編寫自己的解串器。傑克遜的「ObjectMapper」和「模塊」功能可能會對您有所幫助。 – ipavlic 2013-02-21 15:16:17
就我而言,我知道只有沒有','的字符串作爲值。但是,是的,它看起來像我將不得不編寫我自己的解析器。 – Jan 2013-02-21 15:25:57