答案 1
试试这个,
public JSONObject (Map copyFrom)
通过从给定映射复制所有名称/值映射来创建新的 JSONObject。
参数 copy来自键为 String 类型且其值为受支持类型的映射。
如果映射的任何键为 null,则抛出 NullPointerException。
基本用法:
JSONObject obj=new JSONObject(yourmap);
从 JSONObject 获取 json 数组
编辑:
JSONArray array=new JSONArray(obj.toString());
编辑:(如果找到例外,那么您可以通过@krb686更改作为评论中的提及)
JSONArray array=new JSONArray("["+obj.toString()+"]");
答案 2
自 androiad API Lvl 19 以来,您可以简单地执行 .但是在较旧的API lvls上,你会得到丑陋的结果(简单地将toString应用于每个非基元值)。new JSONObject(new HashMap())
我从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()方法应用于Map,则可以获得如下结果:
{
"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"
}
}
推荐
-
-
为什么 Array.newInstance(Class<?>, int) 不是通用的? 我的意思是,这有什么好的理由吗?该具有以下签名: 是否有任何充分的理由将返回值类型声明为 ?对我来说,这似乎非常不方便。
-
-
为什么我可以收集任意大数组的并行流,但不能收集顺序流? 在回答时,我遇到了一个奇特的功能。下面的代码按照我的假设工作(现有数组中的前两个值将被覆盖): 我很好奇为什么顺序流不会像并行流那样覆盖数组的元素。我搜索了一下,无法找到
-
Java JNI 调用的开销 首先让我说,这个问题更多的是出于好奇心,而不是真正的必要性。 我很想知道从Java执行JNI调用的开销是多少,比如说,与分配数组并使用for循环复制元素相比。 如果开销很大