【问题标题】:Convert JSON to Map将 JSON 转换为地图
【发布时间】:2010-10-01 09:44:13
【问题描述】:

这样转换 JSON 代码的最佳方法是什么:

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

在其中一个键是 (field1, field2) 而这些字段的值是 (value1, value2) 的 Java Map 中。

有什么想法吗?我应该为此使用 Json-lib 吗?或者我自己写解析器会更好?

【问题讨论】:

标签: java json parsing collections


【解决方案1】:

JsonTools 库非常完整。可以在Github找到。

【讨论】:

    【解决方案2】:

    我希望你是在开玩笑说要编写自己的解析器。 :-)

    对于这样一个简单的映射,http://json.org(java 部分)中的大多数工具都可以工作。 对于其中之一(Jackson https://github.com/FasterXML/jackson-databind/#5-minute-tutorial-streaming-parser-generator),你会这样做:

    Map<String,Object> result =
            new ObjectMapper().readValue(JSON_SOURCE, HashMap.class);
    

    (其中 JSON_SOURCE 是文件、输入流、阅读器或 json 内容字符串)

    【讨论】:

    • 此外,如果你想要一个类型化的 Map(利用 java 泛型),你可以这样做: Map typedMap = mapper.readValue(jsonStream, new TypeReference> () {});
    • 如果你使用 Maven 项目,你需要 com.fasterxml.jackson.corejackson-databind2.4。 4
    • 看起来杰克逊从 09 年开始就搬家了,所以:Jackson data-bind
    • @obe6 我猜 OP 不是在开玩笑。除了任意变量名之外,你能在你的代码 sn-p 的任何地方找到一个“JSON”吗?由于 Jackson API 中的名称,我也在苦苦挣扎。
    • FWTW,虽然@obe6 的回答在技术上是正确的,但您也可以使用更短的形式:Map&lt;String,Object&gt; result = mapper.readValue(source, Map.class)
    【解决方案3】:

    JSON to Map 始终是字符串/对象数据类型。我有来自谷歌的 GSON 库。

    运行良好,最低要求是 JDK 1.5。

    【讨论】:

    • 您是如何使用 GSON 的?
    【解决方案4】:

    使用 JSON 库,例如http://www.json.org/java/

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

    【讨论】:

      【解决方案5】:

      使用 GSON 库:

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

      使用以下代码:

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

      【讨论】:

      • java 处于最佳状态:TypeToken&lt;Map&lt;String, Map&gt;&gt; :-)
      • 使用 new TypeToken> 当里面有数组时它也可以工作。
      【解决方案6】:

      我喜欢google gson 图书馆。
      当你不知道 json 的结构时。你可以使用

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

      然后你就可以使用 json 了。例如如何从您的 gson 中获取“value1”:

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

      【讨论】:

      • 如果您得到意外数据,这可能会以 5 种不同的方式抛出 NullPointerExceptions。
      • 你现在可以使用 .path() 并且它不会抛出 NPE
      【解决方案7】:

      这样它就像地图一样工作......

      JSONObject fieldsJson = new JSONObject(json);
      String value = fieldsJson.getString(key);
      
      <dependency>
          <groupId>org.codehaus.jettison</groupId>
          <artifactId>jettison</artifactId>
          <version>1.1</version>
      </dependency>
      

      【讨论】:

      • 是的,但是由于 JSON 异常,您必须将每个“get”包装在 try/catch 中。
      • 你可以写一个类 JsonMap implements Map&lt;String,Object 来包装 JSONObject。那么你就得到了真正的Map 接口。
      • 请添加使用过的库。
      【解决方案8】:
      java.lang.reflect.Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
      Gson gson = new Gson();
      Map<String, Object> categoryicons = gson.fromJson(json, mapType );
      

      【讨论】:

        【解决方案9】:

        我的帖子可能对其他人有所帮助,所以想象一下您有一张地图,其中包含特定的值对象,如下所示:

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

        要使用 GSON 库解析这个 JSON 文件,很简单: 如果你的项目是 mavenized

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

        然后使用这个 sn-p :

        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());
        }
        

        对应的POJO应该是这样的:

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

        希望对你有帮助!

        【讨论】:

          【解决方案10】:

          Underscore-java 库可以将 json 字符串转换为哈希映射。我是项目的维护者。

          代码示例:

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

          【讨论】:

            【解决方案11】:

            另一种选择是json-simple,可以在Maven Central中找到:

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

            工件为 24kbytes,没有其他运行时依赖项。

            【讨论】:

            • 我从一个简单的 JSON 字符串返回 null,其中一个值是字符串数组。
            【解决方案12】:

            使用谷歌的 Gson 2.7(也可能是更早的版本,但我测试了 2.7)很简单:

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

            它返回一个 class com.google.gson.internal.LinkedTreeMap 类型的 Map 并递归地作用于嵌套对象。

            【讨论】:

              【解决方案13】:

              我是这样做的。很简单。

              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<String, String> map = new Gson().fromJson(jsonObj.toString(),Map.class);
                      System.out.println(map);
                  }
              }
              

              【讨论】:

              【解决方案14】:
              import net.sf.json.JSONObject
              
              JSONObject.fromObject(yourJsonString).toMap
              

              【讨论】:

                【解决方案15】:

                如果您需要没有任何依赖关系的纯 Java,您可以使用 Java 8 中的 Nashorn API 构建。它在 Java 11 中已弃用。

                这对我有用:

                ...
                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;
                    }
                }
                

                使用示例

                JSON:

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

                代码:

                ...
                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;
                }
                

                【讨论】:

                  【解决方案16】:

                  如果您使用的是 org.json,JSONObject 有一个方法 toMap()。 您可以轻松做到:

                  Map<String, Object> myMap = myJsonObject.toMap();
                  

                  【讨论】:

                    【解决方案17】:

                    试试这个代码:

                      public static Map<String, Object> convertJsonIntoMap(String jsonFile) {
                            Map<String, Object> map = new HashMap<>();
                            try {
                                ObjectMapper mapper = new ObjectMapper();
                                mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
                                mapper.readValue(jsonFile, new TypeReference<Map<String, Object>>() {
                                });
                                map = mapper.readValue(jsonFile, new TypeReference<Map<String, String>>() {
                                });
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            return map;
                        }
                    

                    【讨论】:

                      【解决方案18】:

                      JSON to Map 始终是字符串/对象数据类型。我有来自谷歌的 GSON 库。 使用字符串的 Gson 库不适用于您需要做其他事情的复杂对象

                      【讨论】:

                        猜你喜欢
                        • 2017-02-14
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-04-08
                        • 2017-03-22
                        相关资源
                        最近更新 更多