将 JSON 转换为地图
Posted
技术标签:
【中文标题】将 JSON 转换为地图【英文标题】:Convert JSON to Map 【发布时间】:2010-10-01 09:44:13 【问题描述】:这样转换 JSON 代码的最佳方法是什么:
"data" :
"field1" : "value1",
"field2" : "value2"
在其中一个键是 (field1, field2) 而这些字段的值是 (value1, value2) 的 Java Map 中。
有什么想法吗?我应该为此使用 Json-lib 吗?或者我自己写解析器会更好?
【问题讨论】:
我已经为此编写了代码,但没有使用任何库。 ***.com/questions/21720759/jsonobject-to-map/… 【参考方案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 泛型),你可以这样做: MapMap<String,Object> 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<Map<String, Map>>
:-)
使用 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<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);
【讨论】:
我试过这种方法,但它不起作用......你能回答这个问题吗? ***.com/questions/60329223/…【参考方案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 库不适用于您需要做其他事情的复杂对象
【讨论】:
以上是关于将 JSON 转换为地图的主要内容,如果未能解决你的问题,请参考以下文章