web-dev-qa-db-fra.com

Comment convertir HashMap en JSON Array sous Android?

Je veux convertir HashMap to tableau json mon code est le suivant:

Map<String, String> map = new HashMap<String, String>();

map.put("first", "First Value");

map.put("second", "Second Value");

J'ai essayé ça mais ça n'a pas marché. Toute solution?

JSONArray mJSONArray = new JSONArray(Arrays.asList(map));
15
Sandeep

Essaye ça,

public JSONObject (Map copyFrom) 

Crée un nouvel objet JSON en copiant tous les mappages nom/valeur de la mappe donnée.

Paramètres CopyDans une carte dont les clés sont du type String et dont les valeurs correspondent aux types pris en charge. 

Lance NullPointerException si l'une des clés de la carte est null. 

Utilisation de base:

JSONObject obj=new JSONObject(yourmap);

récupère le tableau json à partir de JSONObject

Modifier:

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

Édition: (Si vous avez trouvé une exception, vous pouvez modifier la mention dans le commentaire de @ krb686)

JSONArray array=new JSONArray("["+obj.toString()+"]");
41
Pragnani

Depuis androiad API Lvl 19, vous pouvez simplement faire new JSONObject(new HashMap()). Mais sur les anciennes API, vous obtenez un résultat moche (appliquez simplement toString à chaque valeur non primitive).

J'ai collecté des méthodes de JSONObject et JSONArray pour simplifier et obtenir un résultat magnifique. Vous pouvez utiliser ma classe de solution:

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

Ensuite, si vous appliquez la méthode mapToJson () à votre carte, vous pouvez obtenir le résultat suivant:

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

Une mappe se compose de paires clé/valeur, c’est-à-dire deux objets pour chaque entrée, alors qu’une liste ne contient qu’un seul objet pour chaque entrée. Ce que vous pouvez faire est d'extraire tout Map.Entry <K, V> puis de les mettre dans le tableau:

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

Alternativement, il est parfois utile d'extraire les clés ou les valeurs d'une collection:

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

ou

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

Remarque: Si vous choisissez d'utiliser les touches comme entrées, l'ordre n'est pas garanti (la méthode keySet() renvoie une Set). En effet, l’interface Map ne spécifie aucun ordre (à moins que Map soit une SortedMap). 

3
matsev

Vous pouvez utiliser

JSONArray jarray = JSONArray.fromObject(map );

1
Varun

C'est la méthode la plus simple. 

Juste utiliser 

JSONArray jarray = new JSONArray(hashmapobject.toString);
0
ImMathan