我在Android
和Java
中使用共享库,并发现其行为不一致。
图书馆取决于org.json.JSONObject
。这是在库本身包含的jar中,但似乎Android以某种方式覆盖了具有自己的JSON实现的jar。
当我这样做时:
Double a = 0.1;
JSONObject b = new JSONObject();
b.put("Hola", a);
flockSONversionString = b.getString("Hola");
在Android
中,它运行没有问题,但在Java
中,它会抛出异常,因为0.1不是String。第二种行为是我从一开始就预料到的行为。
当我做的时候
Object aObj = b.get("Hola");
if(aObj instanceof Float){
System.out.println("Hola is Float");
} else if (aObj instanceof Long){
System.out.println("Hola is Long");
} else if (aObj instanceof Double){
System.out.println("Hola is Double");
} else if (aObj instanceof String){
System.out.println("Hola is String");
} else {
System.out.println("Hola has unknown type");
}
Android
和Java
都得到了Hola is Double
。
奇怪的是,如果你转到org.json.JSONObject
的源代码,getString()
方法声明如下:
public String getString(String key) throws JSONException {
Object object = get(key);
if (object instanceof String) {
return (String)object;
}
throw new JSONException("JSONObject[" + quote(key) +
"] not a string.");
}
这似乎完全符合预期的行为,因为它会检查Object
是否为String
,如果不是org.json.JSONObject
则会抛出异常。
知道为什么会这样吗?
谢谢!
(我无法更改Android
的依赖关系,因为这会破坏Java
和{{1}}之间的兼容性
答案 0 :(得分:1)
您确定在两个项目中都使用相同的jar吗?
Android的languages = (
{
id = 105541139480550;
name = Indonesian;
},
{
id = 106059522759137;
name = English;
},
{
id = 103088979730830;
name = "Mandarin Chinese";
}
);
不同:
org.json.JSONObject.toString(String)
/**
* Returns the value mapped by {@code name} if it exists, coercing it if
* necessary, or throws if no such mapping exists.
*
* @throws JSONException if no such mapping exists.
*/
public String getString(String name) throws JSONException {
Object object = get(name);
String result = JSON.toString(object);
if (result == null) {
throw JSON.typeMismatch(name, object, "String");
}
return result;
}
:
JSON.toString(Object)
在你的情况下,这不会在Android上引发异常。
答案 1 :(得分:0)
String aString = Double.toString(aDouble);
passastring而不是(a);
答案 2 :(得分:0)
对于第一部分,getString
/**
* Returns the value mapped by {@code name} if it exists, coercing it if
* necessary, or throws if no such mapping exists.
*
* @throws JSONException if no such mapping exists.
*/
public String getString(String name) throws JSONException {
Object object = get(name);
String result = JSON.toString(object);
if (result == null) {
throw JSON.typeMismatch(name, object, "String");
}
return result;
}
这里的重要一行是String result = JSON.toString(object);
。在它上方,将调用get
(方法解释如下),它将通过调用JSON.toString
将您的double转换为字符串(您可以在源代码中进一步检查它)
现在对于代码的第二部分,当你执行get(KEY)
时,它将返回一个对象(对于它的代码而言),你将有一个双倍,因为那就是你所放的。
/**
* Returns the value mapped by {@code name}, or throws if no such mapping exists.
*
* @throws JSONException if no such mapping exists.
*/
public Object get(String name) throws JSONException {
Object result = nameValuePairs.get(name);
if (result == null) {
throw new JSONException("No value for " + name);
}
return result;
}
作为结论,这些是android用于JSONObject的方法,我检查了java源代码,似乎方法getString
和get
具有不同的逻辑。我假设你为android(使用android sdk)编译一次,为java项目编译一次,因此你有这个结果。