2013-04-02 2 views
0

Im пытается декодировать строку json на карту.Java decode JSON

Я знаю, что таких вопросов было много, но мне нужен совершенно конкретный формат. Например, у меня есть строка JSON:

{ 
    "map": { 
     "a": "b", 
     "c": "d", 
    }, 
    "map2": { 
     "aa": "bb", 
     "cc": "dd", 
    }, 
    "something": "a", 
    "something2": "b" 
} 

И мне нужно иметь результаты как:

"map.a" => "b" 
"map.c" => "d" 
"map2.aa" => "bb" 
"map2.cc" => "dd" 
"something" => "a" 
"something2" => "b" 

Я уверен, что ключи не будет содержать каких-либо точек. Я смотрел несколько библиотек JSON, но мне не нужно так много функций, просто чтобы декодировать и хранить в Java-карте. Если нет простого способа, я собираюсь написать собственный алгоритм для этого, я надеюсь, что это будет не так сложно ...

Спасибо за любую помощь.

+0

Даже если вы используете свой собственный алгоритм для генерации ключей в дот-нотации, я бы рекомендовал использовать библиотеку декодера. Слишком много краевых шкафов, которые могут вызвать неприятные ошибки, такие как правила экранирования строк. – Philipp

ответ

1

Я использовал org.codehaus.jackson. Выполните следующие действия:

HashMap<String, Object> content = null; 
    HashMap<String, String> result = new HashMap<String, String>(); 

    try { 
     JsonFactory factory = new JsonFactory(); 
     ObjectMapper mapper = new ObjectMapper(factory); 
     TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() { 
     }; 
     content = mapper.readValue(jsonString, typeRef); 

    } catch (Exception ex) { 
     System.out.println("Exception : " + ex); 
    } 
    // now content has everything inside 
    for(String s : content.keySet()){ 
     Object obj = content.get(s); 
     if(obj instanceof String){ 
      result.put(s, (String)obj); 
     } else { 
      HashMap<String,String> hm = (HashMap<String,String>)obj; 
      for(String s2: hm.keySet()){ 
       result.put(s+"."+s2, hm.get(s2)); 
      } 

     } 
    } 

Edit: Протестировано и работает

+0

Просто то, что мне нужно! Спасибо! :) –

+0

приветствую :) – anvarik

1

Для точного анализа JSON вы хотите определить для него правильный синтаксический анализатор, им нелегко написать достаточно много времени. Моя рекомендация заключалась бы в том, чтобы найти довольно легкий парсер JSON, а затем написать декоратору для получения формата карты, который вы ищете. Хотя, если вы обрабатываете большое количество JSON, вы, к сожалению, добавляете накладные расходы.

1

Я не думаю, что вы найдете готовое решение, так как это нестандартное представление. Мое предложение состояло в том, чтобы использовать библиотеку JSON для преобразования строки JSON в Java-карту, а затем выполнить обход глубины этой карты, чтобы преобразовать ее в желаемое представление.