web-dev-qa-db-ja.com

AndroidでHashMapをjson配列に変換する方法は?

私はconvert HashMap to json arrayにしたい私のコードは次のとおりです:

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

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

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

私はこれを試しましたが、うまくいきませんでした。解決策はありますか?

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

これを試して、

public JSONObject (Map copyFrom) 

指定されたマップからすべての名前/値マッピングをコピーすることにより、新しいJSONObjectを作成します。

パラメーターcopyFromキーがString型であり、値がサポートされている型であるマップから。

マップのキーのいずれかがnullの場合、NullPointerExceptionをスローします。

基本的な使用法:

JSONObject obj=new JSONObject(yourmap);

JSONObjectからjson配列を取得

編集:

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

編集:(例外が見つかった場合は、@ krb686のコメントに記載されているように変更できます)

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

Androiad API Lvl 19以降、単純にnew JSONObject(new HashMap())を実行できます。しかし、古いAPIレベルでは、い結果が得られます(各非プリミティブ値にtoStringを単純に適用します)。

JSONObjectとJSONArrayからメソッドを収集して、結果を単純化して美しくしました。私のソリューションクラスを使用できます:

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

次に、mapToJson()メソッドをマップに適用すると、次のような結果が得られます。

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

マップはキー/値のペア、つまり各エントリに2つのオブジェクトで構成されますが、リストには各エントリに1つのオブジェクトしかありません。できることは、すべての Map.Entry <K、V> を抽出して、配列に入れることです。

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

または、コレクションのキーまたはの値を抽出すると便利な場合があります。

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

または

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

注:keysをエントリとして使用することを選択した場合、順序は保証されません(keySet()メソッドはSet)。これは、Mapインターフェイスが順序を指定しないためです(MapがたまたまSortedMapである場合を除く)。

3
matsev

使用できます

JSONArray jarray = JSONArray.fromObject(map );

1
Varun

これが最も簡単な方法です。

使うだけ

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