Java和Android之间的行为不一致

时间:2015-07-14 05:06:44

标签: java android json

我在AndroidJava中使用共享库,并发现其行为不一致。

图书馆取决于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");
    }

AndroidJava都得到了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}}之间的兼容性

3 个答案:

答案 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

的android源代码
 /**
 * 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源代码,似乎方法getStringget具有不同的逻辑。我假设你为android(使用android sdk)编译一次,为java项目编译一次,因此你有这个结果。