2016-07-07 3 views
0

그래, Gson과 구문 분석하려는 JSON 조각이 있습니다. 문자열을 값으로, longs를 키로하고 싶습니다.중복 키가있는 Json에서 맵을 구성하는 방법

{ "completed_questions"[[ "문자열", 12345], ...]}

문제가되는 데이터 유형, 나는 모든 구문 분석 그러나 저을 제공하는 Map<String, Long>을하려고 할 때 중복 된 String 키로 인해 오류가 발생했습니다.

나는 Gson이 그들을 바꿔 먹을 것을 알았을 것이라고 생각하면서 그것을 뒤집어 썼다. 그러나 내가 시도했을 때 Map<Long, String>는 나의 Strings를 Longs로 해석 할 수 없다는 오류가 발생했다.

작동 시키려면 키와 값 유형을 사용하는 스왑 맵 클래스를 만들고 이렇게 바꾸십시오. public class SwapMap<K, V> implements Map<K, V> 그러나 put/get/remove와 같은 스왑 된 맵 작업을 변환하는 것은 작업하기가 매우 어려워 보입니다.

문자열이 고유하지 않더라도 Gson을 사용하여 구문 분석하는 가장 좋은 방법은 무엇입니까? (그러나 숫자는)

답변

0

그래서 내가 한 것은이 값을 LongSparseArray<String>에 매핑 한 맞춤 Gson 디시리얼라이저로 만들었습니다. 이것이 가장 좋은 방법입니다.

@Provides @Singleton Gson provideGson() { 
return new GsonBuilder() 
    .registerTypeAdapter(MyClass.class, new MyClass()) 
    .create(); 
} 
1

JSON은 json 객체에서 동일한 레벨의 동일한 키를 허용하지 않습니다. json 배열을 자바 맵에 매핑하려고하는 것 같습니다.

Gson이 제공 한 기본 변환을 사용하려면 다음 데이터 구조를 기반으로 목록이 필요합니다.

private static void mapToObject() { 
     String json = "{\"completed_questions\":[[\"String\",12345],[\"String\",123456]]}"; 

     Gson gson = new Gson(); 
     CompletedQuestions questions = gson.fromJson(json, CompletedQuestions.class); 

     for (List<String> arr : questions.getCompleted_questions()) { 
      for (String val : arr) { 
       System.out.print(val + " "); 
      } 
      System.out.println(); 
     } 

    } 

    public static class CompletedQuestions { 

     List<List<String>> completed_questions; 

     public List<List<String>> getCompleted_questions() { 
      return completed_questions; 
     } 
    } 

이 출력 : 여기에

{ 
    "completed_questions": [ 
    [ 
     "String", 
     12345 
    ], 
    [ 
     "String", 
     12345 
    ] 
    ] 
} 

빠른 구현

String 12345 
String 123456 

주목해야 할 것은 내가 밀접 데이터 모델과 유사 매핑을 위해 목록을 사용하고 있다는 것입니다 제공됩니다.

이렇게하면 변환을 오래해야합니다. 그러나 json 문자열이 보이는 방식. 당신이 지표를 조작해야 할 것처럼 보입니다. json 구조를 제어 할 수 있다면 더 나은 모델을 만드는 것이 좋습니다. 다른 방법으로 list.get (0) -> 키 list.get (1) -> 내부 목록에 long 인 값을 지정할 수 있습니다.

+0

네, 그래서 캐스팅 목록을 사용하는 방법에 대한 걱정 :

for (JsonElement array : jsonObject.get("my_key").getAsJsonArray()) { if (array.getAsJsonArray().size() == 2) { String value = array.getAsJsonArray().get(VALUE).getAsString(); long key = array.getAsJsonArray().get(KEY).getAsLong(); progress.completedActivities.put(key, value); } } 

그럼 난 그냥 그렇게처럼 내 GSON 작성자에 추가 :

이는 디시리얼라이저의 관련 부분이다. indexOf(); 하지만이 옵션은 여전히 ​​SwapMap 클래스보다 깔끔하게 보입니다. – MrEngineer13

관련 문제