Java 将包转换为JSON
我想将一个Intent的extras包转换成一个JSONObject,这样我就可以将它传递给JavaScript或从JavaScript传递出去 有没有一种快速或最好的方法来进行转换?如果不是所有可能的Bundle都能工作,那也没关系。您可以使用Java 将包转换为JSON,java,android,json,android-intent,Java,Android,Json,Android Intent,我想将一个Intent的extras包转换成一个JSONObject,这样我就可以将它传递给JavaScript或从JavaScript传递出去 有没有一种快速或最好的方法来进行转换?如果不是所有可能的Bundle都能工作,那也没关系。您可以使用Bundle\keySet()获取Bundle包含的密钥列表。然后可以迭代这些键,并将每个键值对添加到JSONObject: JSONObject json = new JSONObject(); Set<String> keys = bun
Bundle\keySet()
获取Bundle包含的密钥列表。然后可以迭代这些键,并将每个键值对添加到JSONObject
:
JSONObject json = new JSONObject();
Set<String> keys = bundle.keySet();
for (String key : keys) {
try {
// json.put(key, bundle.get(key)); see edit below
json.put(key, JSONObject.wrap(bundle.get(key)));
} catch(JSONException e) {
//Handle exception here
}
}
JSONObject json=new JSONObject();
Set keys=bundle.keySet();
用于(字符串键:键){
试一试{
//put(key,bundle.get(key));参见下面的编辑
put(key,JSONObject.wrap(bundle.get(key));
}捕获(JSONException e){
//在这里处理异常
}
}
请注意,JSONObject#put
需要捕获一个JSONException
编辑:
有人指出,前面的代码不能很好地处理Collection
和Map
类型。如果您使用的是API 19或更高版本,那么有一个JSONObject#wrap
方法,如果这对您很重要,它将提供帮助。从:
如有必要,包裹对象。如果对象为null,则返回null
对象如果它是数组或集合,则将其包装在JSONArray中。如果是
是一个映射,将其包装在JSONObject中。如果它是标准属性
(Double、String等)然后它已经被包装好了。否则,如果
来自某个java包,将其转换为字符串。如果它
否则,请尝试将其包装到JSONObject中。如果包装失败,那么
返回null
私有字符串getJson(最终绑定){
if(bundle==null)返回null;
JSONObject JSONObject=新的JSONObject();
for(字符串键:bundle.keySet()){
Object obj=bundle.get(键);
试一试{
jsonObject.put(key,wrap(bundle.get(key));
}捕获(JSONException e){
e、 printStackTrace();
}
}
返回jsonObject.toString();
}
公共静态对象换行(对象o){
如果(o==null){
返回JSONObject.NULL;
}
if(o JSONArray的instanceof | | o JSONObject的instanceof){
返回o;
}
if(o.equals(JSONObject.NULL)){
返回o;
}
试一试{
if(o集合的实例){
返回新的JSONArray((集合)o);
}else if(o.getClass().isArray()){
返回杰索纳雷(o);
}
if(o映射的实例){
返回新的JSONObject((Map)o);
}
如果(o)实例为布尔型||
o字节实例||
o字符实例||
双实例||
浮点数的实例||
o整数实例||
o长实例||
o短实例||
o instanceof字符串){
返回o;
}
if(o.getClass().getPackage().getName().StartWith(“java”)){
返回o.toString();
}
}捕获(忽略异常){
}
返回null;
}
公共静态JSONArray到JSONArray(对象数组)抛出JSONException{
JSONArray结果=新的JSONArray();
如果(!array.getClass().isArray()){
抛出新的JSONException(“不是基元数组:+array.getClass());
}
final int length=Array.getLength(数组);
对于(int i=0;i
这是一个Gson类型的适配器工厂,它将捆绑包转换为JSON
你的额外服务是什么?我不想处理特定的额外服务。我想要一些通用的代码来做这件事,因为这个代码路径可以被我以外的开发人员用来处理任意数据。这个实现似乎不能正确地处理映射或列表。您应该检查从bundle中获得的对象的类型,如果它是一个映射,您可以使用新的JSONObject(映射)构造函数,如果它是一个列表,您可以使用新的JSONArray(列表)Good调用。如果您不想进行检查,还有一个
JSONObject#wrap
方法可以为您进行包装。酷。我不知道这个函数的存在,这让它变得简单多了。我注意到这个函数只在android SDK的第19版中可用,但是你可以从源代码中复制这个函数。喝倒采更新了答案以反映这一点。我使用gson是因为JSONObject.wrap需要构建19。如果您有一个使用gson反序列化的预期对象:P
Object myJsonObj = bundleObject.get("yourKey");
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(myJsonObj.toString()).getAsJsonObject();
json.get("memberInJson").getAsString();
private String getJson(final Bundle bundle) {
if (bundle == null) return null;
JSONObject jsonObject = new JSONObject();
for (String key : bundle.keySet()) {
Object obj = bundle.get(key);
try {
jsonObject.put(key, wrap(bundle.get(key)));
} catch (JSONException e) {
e.printStackTrace();
}
}
return jsonObject.toString();
}
public static Object wrap(Object o) {
if (o == null) {
return JSONObject.NULL;
}
if (o instanceof JSONArray || o instanceof JSONObject) {
return o;
}
if (o.equals(JSONObject.NULL)) {
return o;
}
try {
if (o instanceof Collection) {
return new JSONArray((Collection) o);
} else if (o.getClass().isArray()) {
return toJSONArray(o);
}
if (o instanceof Map) {
return new JSONObject((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;
}
public static JSONArray toJSONArray(Object array) throws JSONException {
JSONArray result = new JSONArray();
if (!array.getClass().isArray()) {
throw new JSONException("Not a primitive array: " + array.getClass());
}
final int length = Array.getLength(array);
for (int i = 0; i < length; ++i) {
result.put(wrap(Array.get(array, i)));
}
return result;
}