如何将hashmap转换为Java中的JSON对象

如何将hashmap转换或转换为Java中的JSON对象,并再次将JSON对象转换为JSONstring?

您可以使用:

new JSONObject(map); 

警告:这只适用于Map<String, String>!

其他function你可以从它的文档中获得
http://stleary.github.io/JSON-java/index.html

Gson也可以用来序列化任意复杂的对象。

这里是你如何使用它:

 Gson gson = new Gson(); String json = gson.toJson(myObject); 

Gson会自动将集合转换为JSON数组。 Gson可以序列化私有字段并自动忽略瞬态字段。

使用json的例子

 Map<String, Object> data = new HashMap<String, Object>(); data.put( "name", "Mars" ); data.put( "age", 32 ); data.put( "city", "NY" ); JSONObject json = new JSONObject(); json.putAll( data ); System.out.printf( "JSON: %s", json.toString(2) ); 

输出::

 JSON: { "age": 32, "name": "Mars", "city": "NY" } 

您也可以尝试使用Google的GSON.Google的GSON是可用于将Java对象转换为其JSON表示的最佳库。

http://code.google.com/p/google-gson/

您可以使用JacksonMap转换为JSON ,如下所示:

 Map<String,Object> map = new HashMap<>(); //You can convert any Object. String[] value1 = new String[] { "value11", "value12", "value13" }; String[] value2 = new String[] { "value21", "value22", "value23" }; map.put("key1", value1); map.put("key2", value2); map.put("key3","string1"); map.put("key4","string2"); String json = new ObjectMapper().writeValueAsString(map); System.out.println(json); 

Jackson Maven依赖关系:

 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.5.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> <scope>compile</scope> </dependency> 

如果您正在使用JSONObject库,则可以按如下方式将地图转换为JSON

 Map<String, Object> map = new HashMap<>(); // Convert a map having list of values. String[] value1 = new String[] { "value11", "value12", "value13" }; String[] value2 = new String[] { "value21", "value22", "value23" }; map.put("key1", value1); map.put("key2", value2); JSONObject json = new JSONObject(map); System.out.println(json); 

JSONObject Maven依赖关系:

 <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20140107</version> </dependency> 

希望这会有所帮助。 快乐的编码。

晚会之后,这里是我的GSON adhoc作家序列化hashmap。 我不得不把键值对的映射作为jsonstring属性,期望一个具体的是整数types。 我不想为这个简单的用例创build定制的JavaBean包装器。

GSON JsonWriter类很容易使用包含less量强typeswriter.value()函数的序列化程序类。

 // write Map as JSON document to http servlet response Map<String,String> sd = DAO.getSD(123); res.setContentType("application/json; charset=UTF-8"); res.setCharacterEncoding("UTF-8"); JsonWriter writer = new JsonWriter(new OutputStreamWriter(res.getOutputStream(), "UTF-8")); writer.beginObject(); for(String key : sd.keySet()) { String val = sd.get(key); writer.name(key); if (key.equals("UniqueID") && val!=null) writer.value(Long.parseLong(val)); else writer.value(val); } writer.endObject(); writer.close(); 

如果没有需要的自定义types,我可以只使用toJson()函数。 gson-2.2.4.jar库只有190KB,没有任何残酷的依赖。 易于使用任何自定义的servlet应用程序或独立的应用程序没有大框架集成。

 Gson gson = new Gson(); String json = gson.toJson(myMap); 

这通常是Json库的工作,你不应该自己去做。 所有的json库都应该实现你所要求的,你可以在页面底部的json.org上find一个Java Json库列表。

如果你需要在代码中使用它。

 Gson gsone = new Gson(); JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject(); 

您可以枚举地图并将键值对添加到JSONObject

方法 :

 private JSONObject getJsonFromMap(Map<String, Object> map) throws JSONException { JSONObject jsonData = new JSONObject(); for (String key : map.keySet()) { Object value = map.get(key); if (value instanceof Map<?, ?>) { value = getJsonFromMap((Map<String, Object>) value); } jsonData.put(key, value); } return jsonData; } 

你可以使用XStream – 这真的很方便。 看到这里的例子

 package com.thoughtworks.xstream.json.test; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; public class WriteTest { public static void main(String[] args) { HashMap<String,String> map = new HashMap<String,String>(); map.add("1", "a"); map.add("2", "b"); XStream xstream = new XStream(new JettisonMappedXmlDriver()); System.out.println(xstream.toXML(map)); } } 

如果你使用net.sf.json.JSONObject那么你不会在其中find一个JSONObject(map)构造函数。 您必须使用public static JSONObject fromObject( Object object )方法。 这个方法接受JSON格式的string,Maps,DynaBeans和JavaBeans。

JSONObject jsonObject = JSONObject.fromObject(myMap);

就我而言,我不想要任何依赖。 使用Java 8,您可以像这样简单地获得JSON:

 Map<String, Object> map = new HashMap<>(); map.put("key", "value"); map.put("key2", "value2"); String json = "{"+map.entrySet().stream() .map(e -> "\""+ e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"") .collect(Collectors.joining(", "))+"}"; 

当在selenium中反序列化自定义命令时,我遇到了类似的问题。 响应是json,但selenium在内部将其转换为java.util.HashMap [String,Object]

如果您熟悉scala并为JSON使用play-API,则可能会从中受益:

 import play.api.libs.json.{JsValue, Json} import scala.collection.JavaConversions.mapAsScalaMap object JsonParser { def parse(map: Map[String, Any]): JsValue = { val values = for((key, value) <- map) yield { value match { case m: java.util.Map[String, _] @unchecked => Json.obj(key -> parse(m.toMap)) case m: Map[String, _] @unchecked => Json.obj(key -> parse(m)) case int: Int => Json.obj(key -> int) case str: String => Json.obj(key -> str) case bool: Boolean => Json.obj(key -> bool) } } values.foldLeft(Json.obj())((temp, obj) => { temp.deepMerge(obj) }) } } 

小代码说明:

代码recursion遍历HashMap直到find基本types(String,Integer,Boolean)。 这些基本types可以直接包装成一个JsObject。 当recursion展开时,deepmerge连接创build的对象。

'@ unchecked'负责types擦除警告。

下划线库可以将哈希映射或数组列表转换为json和反之 。

代码示例:

 import com.github.underscore.lodash.$; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("1", "a"); map.put("2", "b"); System.out.println($.toJson(map)); // { // "1": "a", // "2": "b" // } } } 

不需要Gson或JSONparsing库。 只需使用new JSONObject(Map<String, JSONObject>).toString() ,例如:

 /** * convert target map to JSON string * * @param map the target map * @return JSON string of the map */ @NonNull public String toJson(@NonNull Map<String, Target> map) { final Map<String, JSONObject> flatMap = new HashMap<>(); for (String key : map.keySet()) { try { flatMap.put(key, toJsonObject(map.get(key))); } catch (JSONException e) { e.printStackTrace(); } } try { // 2 indentSpaces for pretty printing return new JSONObject(flatMap).toString(2); } catch (JSONException e) { e.printStackTrace(); return "{}"; } } 

你可以使用Gson 。 该库提供了将Java对象转换为JSON对象的简单方法,反之亦然。

例:

 GsonBuilder gb = new GsonBuilder(); Gson gson = gb.serializeNulls().create(); gson.toJson(object); 

当您需要设置默认设置以外的configuration选项时,您可以使用GsonBuilder。 在上面的例子中,转换过程也会将对象的空属性序列化。

但是,这种方法只适用于非genericstypes。 对于genericstypes,您需要使用toJson(object,Type)。

关于Gson的更多信息在这里 。

请记住,该对象必须实现Serializable接口。

如果使用复杂对象,则应该应用enableComplexMapKeySerialization() ,如https://stackoverflow.com/a/24635655/2914140和https://stackoverflow.com/a/26374888/2914140中所述; 。

 Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); Map<Point, String> original = new LinkedHashMap<Point, String>(); original.put(new Point(5, 6), "a"); original.put(new Point(8, 8), "b"); System.out.println(gson.toJson(original)); 

输出将是:

 { "(5,6)": "a", "(8,8)": "b" } 

这里我用GSON的单线解决scheme:

 myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class); 

对于那些使用org.json.simple.JSONObject ,可以将地图转换为Json String并parsing它以获取JSONObject

 JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map)); 
  import org.json.JSONObject; HashMap<Object, Object> map = new HashMap<>(); String[] list={"Grader","Participant"}; String[] list1={"Assistant","intern"}; map.put("TeachingAssistant",list); map.put("Writer",list1); JSONObject jsonObject = new JSONObject(map); System.out.printf(jsonObject.toString()); // Result: {"TeachingAssistant":["Grader","Participant"],"Writer":["Assistant","intern"]}