Converter JSON para o mapa

Qual é a melhor maneira de converter um código JSON como este:

{ "data" : { "field1" : "value1", "field2" : "value2" } } 

em um Mapa Java no qual as chaves são (field1, field2) e os valores para esses campos são (value1, value2).

Alguma ideia? Devo usar o Json-lib para isso? Ou melhor, se eu escrever meu próprio parser?

Espero que você esteja brincando de escrever seu próprio parser. 🙂

Para um mapeamento tão simples, a maioria das ferramentas do http://json.org (seção java) funcionaria. Para um deles (Jackson, http://wiki.fasterxml.com/JacksonInFiveMinutes ), você faria:

 HashMap result = new ObjectMapper().readValue(JSON_SOURCE, HashMap.class); 

(onde JSON_SOURCE é um arquivo, stream de input, leitor ou cadeia de conteúdo json)

Eu gosto da biblioteca do google gson .
Quando você não conhece a estrutura do json. Você pode usar

 JsonElement root = new JsonParser().parse(jsonString); 

e então você pode trabalhar com json. Por exemplo, como obter “value1” do seu gson:

 String value1 = root.getAsJsonObject().get("data").getAsJsonObject().get("field1").getAsString(); 

Usando a biblioteca GSON:

 import com.google.gson.Gson import com.google.common.reflect.TypeToken import java.lang.reclect.Type 

Use o seguinte código:

 Type mapType = new TypeToken>(){}.getType(); Map son = new Gson().fromJson(easyString, mapType); 

Use JSON lib Por exemplo, http://www.json.org/java/

 // Assume you have a Map in JSONObject jdata @SuppressWarnings("unchecked") Iterator nameItr = jdata.keys(); Map outMap = new HashMap(); while(nameItr.hasNext()) { String name = nameItr.next(); outMap.put(name, jdata.getString(name)); } 

Minha postagem pode ser útil para outras pessoas, então imagine que você tenha um mapa com um object específico em valores, algo assim:

 { "shopping_list":{ "996386":{ "id":996386, "label":"My 1st shopping list", "current":true, "nb_reference":6 }, "888540":{ "id":888540, "label":"My 2nd shopping list", "current":false, "nb_reference":2 } } } 

Para analisar esse arquivo JSON com a biblioteca GSON, é fácil: se o seu projeto for mavenizado

  com.google.code.gson gson 2.3.1  

Então use este trecho:

 import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; //Read the JSON file JsonElement root = new JsonParser().parse(new FileReader("/path/to/the/json/file/in/your/file/system.json")); //Get the content of the first map JsonObject object = root.getAsJsonObject().get("shopping_list").getAsJsonObject(); //Iterate over this map Gson gson = new Gson(); for (Entry entry : object.entrySet()) { ShoppingList shoppingList = gson.fromJson(entry.getValue(), ShoppingList.class); System.out.println(shoppingList.getLabel()); } 

O POJO correspondente deve ser algo assim:

 public class ShoppingList { int id; String label; boolean current; int nb_reference; //Setters & Getters !!!!! } 

Espero que ajude !

Desta forma, funciona como um mapa …

 JSONObject fieldsJson = new JSONObject(json); String value = fieldsJson.getString(key);  org.codehaus.jettison jettison 1.1  
 java.lang.reflect.Type mapType = new TypeToken>(){}.getType(); Gson gson = new Gson(); Map categoryicons = gson.fromJson(json, mapType ); 

Eu faço assim. É simples.

 import java.util.Map; import org.json.JSONObject; import com.google.gson.Gson; public class Main { public static void main(String[] args) { JSONObject jsonObj = new JSONObject("{ \"f1\":\"v1\"}"); @SuppressWarnings("unchecked") Map map = new Gson().fromJson(jsonObj.toString(),Map.class); System.out.println(map); } } 

A biblioteca do JsonTools é muito completa. Pode ser encontrado no Github .

Mais uma alternativa é json-simple que pode ser encontrada em Maven Central :

 (JSONObject)JSONValue.parse(someString); //JSONObject is actually a Map. 

O artefato é 24kbytes, não possui outras dependencies de tempo de execução.

Com o Gson 2.7 do google (provavelmente versões anteriores também, mas testei 2.7) é tão simples quanto:

 Map map = gson.fromJson(json, Map.class); 

Que retorna um mapa da class com.google.gson.internal.LinkedTreeMap de tipos class com.google.gson.internal.LinkedTreeMap e funciona recursivamente em objects nesteds.

 import net.sf.json.JSONObject JSONObject.fromObject(yourJsonString).toMap 

A biblioteca Underscore-java pode converter a string json em um mapa hash.

Exemplo de código:

 import com.github.underscore.lodash.U; import java.util.*; public class Main { @SuppressWarnings("unchecked") public static void main(String[] args) { String json = "{" + " \"data\" :" + " {" + " \"field1\" : \"value1\"," + " \"field2\" : \"value2\"" + " }" + "}"; Map data = (Map) U.get((Map) U.fromJson(json), "data"); System.out.println(data); // {field1=value1, field2=value2} } } 

JSON to Map sempre será um tipo de dados de string / object. Eu tenho GSON lib do google.

funciona muito bem e JDK 1.5 é o requisito mínimo.