2016-04-12 5 views
7

私はJson形式の文字列を持っていますが、キーや値のいずれも引用符で囲まれていません。私はこれがそうのように見えるマップになりたい引用符なしのjson文字列をマップに変換する

String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}" 

Map<String, Object> friend1Map = new HashMap<>(); 
friend1Map.put("name", "Dan"); 
friend1Map.put("age", 23); 

Map<String, Object> friend2Map = new Hashmap<>(); 
friend2Map.put("name", "Zane"); 
friend2Map.put("age", 24); 

Map<String, Object> newMap = new HashMap<>(); 
newMap.put("name", "Bob"); 
newMap.put("state", "Colorado"); 
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map)); 

私は次の二つの方法試してみました:

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

この意志を例えば、私はこれを持っていますエラーを投げて、

Unexpected character ('n'): was expecting double-quote to start field name 
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); 

しかし、これはというエラーがスローされました:10は、それから私はマッパーの設定を変更しようとした

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null') 
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11] 

は引用符をJSON文字列に含まれていない場合は、この地図を取得する方法はありますか?

+1

あなたのJson Stringは無効です。ここでそれをテストしてください:http://jsonlint.com –

+0

どうですか?このコメントには1532文字を追加する必要があります。 – user2869231

+0

、またはそれを有効にするにはどうすればよいですか?明らかに、この問題は引用符を持たないことにあります。私はいくつかの厄介な分割を行う必要がありますか? – user2869231

答えて

0

有効でない場合、ObjectMapperはJson入力を解析できないため、答えは「いいえ」です。

ここにあなたのJSONをテスト:あなたができるJSON入力を修正した後http://jsonlint.com/

を:

ObjectMapper ob = new ObjectMapper(); 
    ob.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
    String json = "{name: \"Bob\", state: \"Colorado\", Friends: [{ name: \"Dan\", age: 23 }, {name: \"Zane\", age: 24 }]}"; 

    Map<String, ObjectNode> theMap = ob.readValue(json, Map.class); 
    System.out.println(theMap.get("name")); 

が印刷されます:

ボブ

+1

ジャクソンは無効なJSONを解析できます。 'JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES'に注目してください。引用符で囲まれていないフィールド値を解析することはできません。 – Savior

+0

ありがとうございました。 –

+0

また、あなたの 'theMap'には' String'値だけがありません。そのJSONには配列があります。あなたが提案したものは、型の安全ではありません。代わりに 'ObjectNode'を使用してください。 – Savior

1

をあなたの質問に答えるために:がありませんafeあなたのJSONを取得する方法 - それは無効なので、JSONではない - Map<String, Object>に変換されます。

私は少しだけ(なぜそれが安全に解析することができない?)詳しく説明しましょう。このように、「JSON」を想像し を:

{ 
    this is my key: and here's my value and it even has a colon: 
} 

有効なJSONはこの

{ 
    "this is my key": "and here's my value and it even has a colon:" 
} 
のようになります。

引用符を使用すると、パーサーはキーと値を安全に決定できます。それらがなければパーサは失われます。

関連する問題