私は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));
これを試して、
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()+"]");
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"
}
}
マップはキー/値のペア、つまり各エントリに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
である場合を除く)。
使用できます
JSONArray jarray = JSONArray.fromObject(map );
これが最も簡単な方法です。
使うだけ
JSONArray jarray = new JSONArray(hashmapobject.toString);