24

I want to convert HashMap to json array my code is as follow:

Map<String, String> map = new HashMap<String, String>();
map.put("first", "First Value");
map.put("second", "Second Value");

I have tried this but it didn't work. Any solution?

JSONArray mJSONArray = new JSONArray(Arrays.asList(map));
Rahul Khurana
8,8747 gold badges38 silver badges65 bronze badges
asked Mar 14, 2013 at 6:04
4
  • 1
    So, you have a Map, but want an Array? Well, do that conversion first, independent of JSON, and then give the result (which is now a List/Array) to the appropriate JSON converter. The code posted won't work - and will result in a compiler error, which should be included in the post - because there is no Arrays.asList(Map<K,V>), as that doesn't make sense as there is no universal conversion (although, perhaps you want a List of the Entries?). That is, this question/problem has nothing to do with JSON directly. Commented Mar 14, 2013 at 6:09
  • @pst: thanks but there is any solution on it? to create array with key=> value and convert it to json? in android activity Commented Mar 14, 2013 at 6:12
  • Arrays don't have "key=>value". Provide sample Map data and the expected JSON Array output. Commented Mar 14, 2013 at 6:13
  • Key value is only available with Map family in collection,try to convert Map into String and play with String. Commented Mar 14, 2013 at 6:21

5 Answers 5

49

Try this,

public JSONObject (Map copyFrom) 

Creates a new JSONObject by copying all name/value mappings from the given map.

Parameters copyFrom a map whose keys are of type String and whose values are of supported types.

Throws NullPointerException if any of the map's keys are null.

Basic usage:

JSONObject obj=new JSONObject(yourmap);

get the json array from the JSONObject

Edit:

JSONArray array=new JSONArray(obj.toString());

Edit:(If found Exception then You can change as mention in comment by @krb686)

JSONArray array=new JSONArray("["+obj.toString()+"]");
rockstar
6775 silver badges24 bronze badges
answered Mar 14, 2013 at 6:20
Sign up to request clarification or add additional context in comments.

4 Comments

I have tried but didn't work. Could you please paste code here?
I have no idea by what logic that is supposed to work. I can only hope it's tested - showing input and what it produces (at each stage) would make this an acceptable answer.
@Pragnani Unfortunately this doesn't work. Maybe it used to, but it doesn't anymore. This throws: A JSONArray text must start with '[' at character 1 At the line creating the JSONArray from the JSONObject Fix You need to change to: JSONArray array=new JSONArray("[" + obj.toString() + "]"); Could you edit that? Thanks
In java 7, api 26 android, none of the solutions above produce a valid json array output. The map.toString() function produces braces, {}, not brackets, []
16

Since androiad API Lvl 19, you can simply do new JSONObject(new HashMap()). But on older API lvls you get ugly result(simple apply toString to each non-primitive value).

I collected methods from JSONObject and JSONArray for simplify and beautifully result. You can use my solution class:

package you.package.name;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
public class JsonUtils
{
 public static JSONObject mapToJson(Map<?, ?> data)
 {
 JSONObject object = new JSONObject();
 for (Map.Entry<?, ?> entry : data.entrySet())
 {
 /*
 * Deviate from the original by checking that keys are non-null and
 * of the proper type. (We still defer validating the values).
 */
 String key = (String) entry.getKey();
 if (key == null)
 {
 throw new NullPointerException("key == null");
 }
 try
 {
 object.put(key, wrap(entry.getValue()));
 }
 catch (JSONException e)
 {
 e.printStackTrace();
 }
 }
 return object;
 }
 public static JSONArray collectionToJson(Collection data)
 {
 JSONArray jsonArray = new JSONArray();
 if (data != null)
 {
 for (Object aData : data)
 {
 jsonArray.put(wrap(aData));
 }
 }
 return jsonArray;
 }
 public static JSONArray arrayToJson(Object data) throws JSONException
 {
 if (!data.getClass().isArray())
 {
 throw new JSONException("Not a primitive data: " + data.getClass());
 }
 final int length = Array.getLength(data);
 JSONArray jsonArray = new JSONArray();
 for (int i = 0; i < length; ++i)
 {
 jsonArray.put(wrap(Array.get(data, i)));
 }
 return jsonArray;
 }
 private static Object wrap(Object o)
 {
 if (o == null)
 {
 return null;
 }
 if (o instanceof JSONArray || o instanceof JSONObject)
 {
 return o;
 }
 try
 {
 if (o instanceof Collection)
 {
 return collectionToJson((Collection) o);
 }
 else if (o.getClass().isArray())
 {
 return arrayToJson(o);
 }
 if (o instanceof Map)
 {
 return mapToJson((Map) o);
 }
 if (o instanceof Boolean ||
 o instanceof Byte ||
 o instanceof Character ||
 o instanceof Double ||
 o instanceof Float ||
 o instanceof Integer ||
 o instanceof Long ||
 o instanceof Short ||
 o instanceof String)
 {
 return o;
 }
 if (o.getClass().getPackage().getName().startsWith("java."))
 {
 return o.toString();
 }
 }
 catch (Exception ignored)
 {
 }
 return null;
 }
}

Then if you apply mapToJson() method to your Map, you can get result like this:

{
 "int": 1,
 "Integer": 2,
 "String": "a",
 "int[]": [1,2,3],
 "Integer[]": [4, 5, 6],
 "String[]": ["a","b","c"],
 "Collection": [1,2,"a"],
 "Map": {
 "b": "B",
 "c": "C",
 "a": "A"
 }
}
answered Apr 7, 2014 at 12:09

2 Comments

Sweet! I wish I could give this +10! I'll have to look at the source code for API 19 to see if this is what they're doing. Thanks!
Had the same problem with undecodable string being sent looking like: {key=value, key2=value2}
3

A map consists of key / value pairs, i.e. two objects for each entry, whereas a list only has a single object for each entry. What you can do is to extract all Map.Entry<K,V> and then put them in the array:

Set<Map.Entry<String, String> entries = map.entrySet();
JSONArray mJSONArray = new JSONArray(entries);

Alternatively, sometimes it is useful to extract the keys or the values to a collection:

Set<String> keys = map.keySet();
JSONArray mJSONArray = new JSONArray(keys);

or

List<String> values = map.values();
JSONArray mJSONArray = new JSONArray(values);

Note: If you choose to use the keys as entries, the order is not guaranteed (the keySet() method returns a Set). That is because the Map interface does not specify any order (unless the Map happens to be a SortedMap).

answered Mar 14, 2013 at 6:28

Comments

2

This is the Simplest Method.

Just use

JSONArray jarray = new JSONArray(hashmapobject.toString);
answered Feb 14, 2014 at 11:06

Comments

1

You can use

JSONArray jarray = JSONArray.fromObject(map );

answered Mar 14, 2013 at 6:06

3 Comments

These classes are available in JSON-Lib library. You can find this library here: json-lib.sourceforge.net
@Forhad: Thanks, But my hash created dynamically in my code so its not suitable for me is any other option to create array with key=>value and convert in json in android activity?

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.