2016-11-08 33 views
0

申し訳ありませんが、私の問題は他の問題です。 json-stringから解析するためのJSONパーサメソッドがあります。しかし、json-stringにもjson-stringという値があります。そのような何か:JSON文字列をマップに変換するには

{ 
    "status_code":"255", 
    "data":"{\"user\":{\"idpolzovatel\":1,\"id_poluch_tip\":1,\"fio_polzovatel\":\"Andrew Artificial\",\"login\":\"imi\",\"parol\":\"698d51a19d8a121ce581499d7b701668\",\"key\":null,\"nachalnik\":1,\"buhgalter\":0,\"delopr\":1},\"token\":\"230047517dd122c8f8116a6fa591a704\"}", 
    "message":"Successfull!" 
} 

だから、私の構文解析方法:

public Map<String, String> convertToMapFromJSON(String res){ 
    ObjectMapper objectMapper = new ObjectMapper(); 
    Map<String, String> response = new HashMap<String, String>(); 
    try { 
     response = objectMapper.readValue(res, new TypeReference<Map<String, String>>); 
     int t = 0; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return response; 
} 

私はクライアントのレスポンスを取得する:

ResponseEntity<String> responseEntity = restTemplate.postForEntity(REST_SERVICE_URI + "/auth/", data, String.class); 

String res = responseEntity.getBody();//получаем тело запроса в формате JSON 

は、それらを使用します方法:

Map<String, String> response = convertToMapFromJSON(res); 

Map<String, String> data1 = convertToMapFromJSON(response.get("data")); 

Map<String, String> userDetailes = convertToMapFromJSON(data1.get("user")); 

しかし、私は最後の方法data1.get("user");を使用する場合、私は例外を取得:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.String 

okが、それを得ました。したがって、data1.get("user")は文字列ではなく、リンクされたハッシュマップです。だから私はこれをすることができます:

Map<String, String> userDetailes = data1.get("user"); 

?しかし、私はIDEが私の言うところによれば、エラーはdata1.get("user")が文字列です。デバッガから

スクリーンショット: enter image description here

ので、どのように私は私のユーザデータでこれのLinkedHashMapを得ることができますか?申し訳ありません、私の英語です。ありがとうございました。

+0

[JSON文字列からハッシュマップを作成する]の可能複製(http://stackoverflow.com/questions/22011200/creating-hashmap-from-a- json-string) – DimaSan

+0

SDEに問題があることがあります。プロジェクトをクリーンアップして再構築しようとすると、IDEコンパイラに依存しないようにコマンドライン(mavenまたはjavac)からビルドしようとします。 – OhadR

+0

実際のJSONペイロードとライブラリ(Jackson?)で質問を更新します。 – LoganMzz

答えて

0

ジェネリックのJava適用型消去。コンパイル時に型の正しさをチェックし、コンパイルコード(ByteCode)でジェネリックシグネチャを削除します。したがって、実行時にチェックはありません。

あなたのJSONライブラリと同じ動作を持っている。この例を参照してください:

/** codes you try to execute/write **/ 
void withStringValues() { 
    Map<String,String> object = raw(Map<String,String>.class); 
    String string = object.get("string"); // Ok 
    String map = object.get("map"); // ClassCastException 
    Map map = object.get("map"); // Doesn't compile 
} 

あなたはrawへの呼び出しを見ることができるようにコンパイルされたコードドンとして有効と考えられている。ここで

/** Returns a generic map which all keys are string but not values **/ 
T <T extends Map> raw(Class<T> clazz) { 
    Map object = new LinkedHashMap(); 
    object.put("string", "This is a String"); 
    object.put("map" , new LinkedHashMap()); 
    return (T) object; 
} 

はあなたのコードですジェネリックをチェックしないでください。しかし、実際にはコンパイルされたコードでは発生しないMapからMap<String,String>への無効で暗黙的なキャストを行います。

void withTypeErasure() { 
    Map object = raw(Map.class); 
    String string = (String) object.get("string"); 
    String map = (String) object.get("map"); 
} 

あなたが見ることができるように、Javaコンパイラは、すべてのジェネリックを削除し、必要なキャストを追加しました:

ジェネリックは削除して、コンパイルされたバージョンがあるです。あなたはここで何がうまくいかないかを見ることができます。

あなたの実際のコードは次のようになります。

void withRealValues() { 
    Map<String,Object> object = raw(Map<String,Object>.class); 
    String    string = (String) object.get("string"); // Ok 
    Map<String,Object> map = (Map) object.get("map");  // Ok 
} 
+0

変更方法。 TypeReferenceクラスを追加します。 – Artificial

+0

TypeReferenceを追加しても、ジェネリック型の消去によって何も変更されません。有効なジェネリックシグネチャは 'Map 'またはジェネリックだけ 'Map'なしです – LoganMzz

+0

助けてくれてありがとう。 – Artificial

0

ObjectMapperがJSON形式の文字列をデコードして解析したようです。 Mapを返す新しいメソッド(data1.get( "user"))を追加するだけで済みます。

関連する問題