Convert JSON to Map

后端 未结 17 2886
天涯浪人
天涯浪人 2020-11-22 10:20

What is the best way to convert a JSON code as this:

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


        
相关标签:
17条回答
  • 2020-11-22 10:59
    import net.sf.json.JSONObject
    
    JSONObject.fromObject(yourJsonString).toMap
    
    0 讨论(0)
  • 2020-11-22 11:01
    java.lang.reflect.Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
    Gson gson = new Gson();
    Map<String, Object> categoryicons = gson.fromJson(json, mapType );
    
    0 讨论(0)
  • 2020-11-22 11:01

    If you're using org.json, JSONObject has a method toMap(). You can easily do:

    Map<String, Object> myMap = myJsonObject.toMap();
    
    0 讨论(0)
  • 2020-11-22 11:04

    If you need pure Java without any dependencies, you can use build in Nashorn API from Java 8. It is deprecated in Java 11.

    This is working for me:

    ...
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    ...
    
    public class JsonUtils {
    
        public static Map parseJSON(String json) throws ScriptException {
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("javascript");
    
            String script = "Java.asJSONCompatible(" + json + ")";
    
            Object result = engine.eval(script);
    
            return (Map) result;
        }
    }
    

    Sample usage

    JSON:

    {
        "data":[
            {"id":1,"username":"bruce"},
            {"id":2,"username":"clark"},
            {"id":3,"username":"diana"}
        ]
    }
    

    Code:

    ...
    import jdk.nashorn.internal.runtime.JSONListAdapter;
    ...
    
    public static List<String> getUsernamesFromJson(Map json) {
        List<String> result = new LinkedList<>();
    
        JSONListAdapter data = (JSONListAdapter) json.get("data");
    
        for(Object obj : data) {
            Map map = (Map) obj;
            result.add((String) map.get("username"));
        }
    
        return result;
    }
    
    0 讨论(0)
  • 2020-11-22 11:06

    My post could be helpful for others, so imagine you have a map with a specific object in values, something like that:

    {  
       "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
          }
       }
    }
    

    To parse this JSON file with GSON library, it's easy : if your project is mavenized

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    Then use this snippet :

    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<String, JsonElement> entry : object.entrySet()) {
        ShoppingList shoppingList = gson.fromJson(entry.getValue(), ShoppingList.class);
        System.out.println(shoppingList.getLabel());
    }
    

    The corresponding POJO should be something like that :

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

    Hope it helps !

    0 讨论(0)
  • 2020-11-22 11:06

    With google's Gson 2.7 (probably earlier versions too, but I tested 2.7) it's as simple as:

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

    Which returns a Map of type class com.google.gson.internal.LinkedTreeMap and works recursively on nested objects.

    0 讨论(0)
提交回复
热议问题