389

How to convert or cast hashmap to JSON object in Java, and again convert JSON object to JSON string?

Nayuki
18.7k6 gold badges59 silver badges84 bronze badges
asked Aug 28, 2012 at 8:53
2
  • 3
    You can directly use ObjectMapper like objectMapper.objectMapper.writeValueAsString(hasMap)) Commented Jul 22, 2021 at 17:21
  • baeldung.com/java-convert-hashmap-to-json-object Commented Nov 12, 2024 at 16:33

29 Answers 29

545

You can use:

new JSONObject(map);

Other functions you can get from its documentation
http://stleary.github.io/JSON-java/index.html

Spartan
3,4116 gold badges28 silver badges32 bronze badges
answered Aug 28, 2012 at 8:57
Sign up to request clarification or add additional context in comments.

7 Comments

This only works for a String,String map and not a complex String,Object.
You are putting Map into JSONObject but how can you get this map from jsonObject?
@slott is right for older versions. Newer versions like kitkat are working fine with more complex objects like HashMap<String, Object>() containing HashMap<String, Object>() as Object. So I recommend Gson.
To convert to JSON String instead of JSON Object: new ObjectMapper().writeValueAsString(map);
|
216

Gson can also be used to serialize arbitrarily complex objects.

Here is how you use it:

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

Gson will automatically convert collections to JSON arrays. Gson can serialize private fields and automatically ignores transient fields.

Pavel Vlasov
4,3816 gold badges45 silver badges55 bronze badges
answered Aug 28, 2012 at 9:44

4 Comments

Note: This does not preserve keys with null values.
How does your post answer the question? It is so confusing. Please mention something relevant to the question as well.
note: when you send some value in Integer this convert in double.
This converts scape characters to Unicode, any solution ??
106

You can convert Map to JSON using Jackson as follows:

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

Maven Dependencies for Jackson :

<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>

If you are using JSONObject library, you can convert map to JSON as follows:

JSONObject Library: import org.json.JSONObject;

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

Maven Dependencies for JSONObject :

<dependency>
 <groupId>org.json</groupId>
 <artifactId>json</artifactId>
 <version>20140107</version>
</dependency>
answered Nov 30, 2016 at 7:17

4 Comments

didn't know I can pass Map as an argument, thanks, helped a lot.
@Gurkha Thanks for appreciating.
@AnkurMahajan +1 for giving proper answer with dependency :)
String json = new ObjectMapper().writeValueAsString(map); Greate
68

Example using 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) );

output::

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

You can also try to use Google's GSON.Google's GSON is the best library available to convert Java Objects into their JSON representation.

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

answered Aug 28, 2012 at 9:01

4 Comments

Sorry for the dig but what does the 2 do in the json.toString(2`)
public String toString(int radix).toString(2) is used for String representation. for more stackoverflow.com/questions/3615721/…
which JSONObject class is this?
No such method: (new org.json.JSONObject()).putAll();
15

You can just enumerate the map and add the key-value pairs to the JSONObject

Method :

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;
}
answered Aug 31, 2016 at 10:08

2 Comments

no shortcuts and working effectively without any additional library
The Map.Entry<K,V>> entrySet() is meant for iteration of a map. Reading the keys and searching the map for each key is a suboptimal way.
14

In my case I didn't want any dependancies. Using Java 8 you can get JSON as a string this simple:

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(", "))+"}";
answered Apr 29, 2016 at 9:06

2 Comments

you're not escaping... if the key or value contains ", this breaks
you're right, this solution has certain limitaions, nested maps is also not supported
10

Underscore-java library can convert hash map or array list to json and vice verse.

import com.github.underscore.U;
import java.util.*;
public class Main {
 public static void main(String[] args) {
 Map<String, Object> map = new LinkedHashMap<>();
 map.put("1", "a");
 map.put("2", "b");
 System.out.println(U.toJson(map));
 // {
 // "1": "a",
 // "2": "b"
 // }
 }
}
answered Nov 13, 2015 at 23:52

Comments

7

Late to the party but here is my GSON adhoc writer for serializing hashmap. I had to write map of key-value pairs as json string attributes, expect one specific to be integer type. I did not want to create custom JavaBean wrapper for this simple usecase.

GSON JsonWriter class is easy to use serializer class containing few strongly typed writer.value() functions.

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

If none of the custom types be needed I could have just use toJson() function. gson-2.2.4.jar library is just under 190KB without any brutal dependencies. Easy to use on any custom servlet app or standalone application without big framework integrations.

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 
answered Aug 26, 2013 at 12:43

Comments

7

If you need use it in the code.

Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();
answered Dec 11, 2015 at 17:51

1 Comment

This one is it, for GSON!
7

This is typically the work of a Json library, you should not try to do it yourself. All json libraries should implement what you are asking for, and you can find a list of Java Json libraries on json.org, at the bottom of the page.

answered Aug 28, 2012 at 8:56

Comments

7

This solution works with complex JSONs:

public Object toJSON(Object object) throws JSONException {
 if (object instanceof HashMap) {
 JSONObject json = new JSONObject();
 HashMap map = (HashMap) object;
 for (Object key : map.keySet()) {
 json.put(key.toString(), toJSON(map.get(key)));
 }
 return json;
 } else if (object instanceof Iterable) {
 JSONArray json = new JSONArray();
 for (Object value : ((Iterable) object)) {
 json.put(toJSON(value));
 }
 return json;
 }
 else {
 return object;
 }
}
answered Mar 18, 2019 at 16:54

Comments

7

We use Gson.

Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);
Nimantha
6,5046 gold badges32 silver badges78 bronze badges
answered Mar 25, 2020 at 17:42

Comments

6

Better be late than never. I used GSON to convert list of HashMap to string if in case you want to have a serialized list.

List<HashMap<String, String>> list = new ArrayList<>();
HashMap<String,String> hashMap = new HashMap<>();
hashMap.add("key", "value");
hashMap.add("key", "value");
hashMap.add("key", "value");
list.add(hashMap);
String json = new Gson().toJson(list);

This json produces [{"key":"value","key":"value","key":"value"}]

answered Jun 7, 2019 at 6:55

4 Comments

This doesn't answer the question. It is producing JSON array, not a JSON object. And someone else has already shown us how to create a JSON object from a hashmap using Gson.
Hi @StephenC, some might looking for an example of JSON array rather than JSON Object since the top comment has already provided the best answer so far. I hope we can provide other answers related to serializing using GSON. My apologies, this answer should be posted on a different thread.
We should be writing answers for people who search properly. If we try to cater for people who can't search by posting off-topic answers, it degrades the site with "noise", and makes it harder for people who know how to search to find relevant answers. If you (now) agree that this Answer is in the wrong place, please just delete it.
@KellyBudol good or bad , your answer is what i looking for.thanks Man
5

Here my single-line solution with GSON:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);
answered Jan 29, 2017 at 15:10

Comments

5

For those using org.json.simple.JSONObject, you could convert the map to Json String and parse it to get the JSONObject.

JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));
answered Apr 11, 2017 at 0:39

Comments

5

If you don't really need HashMap then you can do something like that:

String jsonString = new JSONObject() {{
 put("firstName", user.firstName);
 put("lastName", user.lastName);
}}.toString();

Output:

{
 "firstName": "John",
 "lastName": "Doe"
}
answered Aug 23, 2018 at 14:31

2 Comments

Well yes. However, the question asks for a way to create a JSON object starting from a HashMap, and this doesn't answer that.
Some people could land here from google looking for a generic solution. The above answer might help them.
5

I found another way to handle it.

Map obj=new HashMap(); 
obj.put("name","sonoo"); 
obj.put("age",new Integer(27)); 
obj.put("salary",new Double(600000)); 
String jsonText = JSONValue.toJSONString(obj); 
System.out.print(jsonText);
Nimantha
6,5046 gold badges32 silver badges78 bronze badges
answered Jan 8, 2018 at 21:21

Comments

3

If you are using net.sf.json.JSONObject then you won't find a JSONObject(map) constructor in it. You have to use the public static JSONObject fromObject( Object object ) method. This method accepts JSON formatted strings, Maps, DynaBeans and JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

answered Sep 25, 2014 at 13:28

Comments

3

No need for Gson or JSON parsing libraries. Just using new JSONObject(Map<String, JSONObject>).toString(), e.g:

/**
 * 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 "{}";
 }
}
answered Mar 17, 2017 at 9:22

1 Comment

Swallowing exceptions and returning an empty object is a bad idea.
3

I'm using Alibaba fastjson, easy and simple:

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>VERSION_CODE</version>
</dependency>

and import:

import com.alibaba.fastjson.JSON;

Then:

String text = JSON.toJSONString(obj); // serialize
VO vo = JSON.parseObject("{...}", VO.class); //unserialize

Everything is ok.

answered Dec 27, 2018 at 11:52

Comments

3

If you are using JSR 374: Java API for JSON Processing ( javax json ) This seems to do the trick:

 JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
 JsonObject jsonObject = job.build();
answered Nov 18, 2019 at 16:26

Comments

3

Gson way for a bit more complex maps and lists using TypeToken.getParameterized method:

We have a map that looks like this:

Map<Long, List<NewFile>> map;

We get the Type using the above mentioned getParameterized method like this:

Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();

And then use the Gson object fromJson method like this using the mapOfList object like this:

Map<Long, List<NewFile>> map = new Gson().fromJson(fileContent, mapOfList);

The mentioned object NewFile looks like this:

class NewFile
{
 private long id;
 private String fileName;
 public void setId(final long id)
 {
 this.id = id;
 }
 public void setFileName(final String fileName)
 {
 this.fileName = fileName;
 }
}

The deserialized JSON looks like this:

{
 "1": [
 {
 "id": 12232,
 "fileName": "test.html"
 },
 {
 "id": 12233,
 "fileName": "file.txt"
 },
 {
 "id": 12234,
 "fileName": "obj.json"
 }
 ],
 "2": [
 {
 "id": 122321,
 "fileName": "test2.html"
 },
 {
 "id": 122332,
 "fileName": "file2.txt"
 },
 {
 "id": 122343,
 "fileName": "obj2.json"
 }
 ]
}

answered May 21, 2020 at 9:05

Comments

2

You can use XStream - it is really handy. See the examples here

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)); 
 }
}
answered Aug 28, 2012 at 9:03

1 Comment

But you should cache your xstream object anyone
2

If you use complex objects, you should apply enableComplexMapKeySerialization(), as stated in https://stackoverflow.com/a/24635655/2914140 and 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));

Output will be:

{
 "(5,6)": "a",
 "(8,8)": "b"
}
answered Aug 30, 2016 at 12:15

Comments

2
 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"]}
answered Sep 19, 2017 at 17:31

1 Comment

This is merely repeating an earlier answer.
0

You can use Gson. This library provides simple methods to convert Java objects to JSON objects and vice-versa.

Example:

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

You can use a GsonBuilder when you need to set configuration options other than the default. In the above example, the conversion process will also serialize null attributes from object.

However, this approach only works for non-generic types. For generic types you need to use toJson(object, Type).

More information about Gson here.

Remember that the object must implement the Serializable interface.

answered Aug 22, 2016 at 21:25

Comments

0

This works for me:

import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")
println new JsonBuilder(properties).toPrettyString()
Nimantha
6,5046 gold badges32 silver badges78 bronze badges
answered Nov 6, 2018 at 6:10

3 Comments

This is not a Groovy question.
@stephen-c java is a platform not just language, groovy is just a jar.
The code in your question is not Java. If that code really works for you then you are not using Java. Java doesn't have a "println" statement, and you can't declare a variable like that. My guess is that you are using Groovy, but I'm not sure. Either way, recommending people to use Groovy libraries instead of Java libraries in Java code ... not a good idea.
-1

I faced a similar problem when deserializing the Response from custom commands in selenium. The response was json, but selenium internally translates that into a java.util.HashMap[String, Object]

If you are familiar with scala and use the play-API for JSON, you might benefit from this:

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

Small code description:

The code recursively traverses through the HashMap until basic types (String, Integer, Boolean) are found. These basic types can be directly wrapped into a JsObject. When the recursion is unfolded, the deepmerge concatenates the created objects.

'@unchecked' takes care of type erasure warnings.

answered Jun 14, 2016 at 16:14

1 Comment

This is not a Scala question
-2

First convert all your objects into valid Strings

HashMap<String, String> params = new HashMap<>();
params.put("arg1", "<b>some text</b>");
params.put("arg2", someObject.toString());

Then insert the entire map into a org.json.JSONObject

JSONObject postData = new JSONObject(params);

Now you can get the JSON by simply calling the object's toString

postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}

Create a new JSONObject

JSONObject o = new JSONObject(postData.toString());

Or as a byte array for sending over HTTP

postData.toString().getBytes("UTF-8");
answered Jun 7, 2019 at 10:19

4 Comments

This is saying the same thing as previous answers from years ago, without the advantage of being concise.
@StephenC I have no idea what you're on about
@StephenC "How to convert or cast hashmap to JSON object in Java, and again convert JSON object to JSON string?"
362 people (and counting) think that stackoverflow.com/a/12155874/139985 answers the question. It says basically what your answer says without the frilly bits.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.