我们的Android应用程序有一个包,它只包含与Android分离的纯Java代码。我需要在这个包中使用JSON,并尝试导入官方JSON库。虽然导入是成功的,而且我可以在代码中使用JSON,但它拒绝工作。我经常遇到同样的例外:
java.lang.NoSuchMethodError:没有静态方法g(Ljava/lang/String;)Ljava/lang/Object;在类Lorg/json/json/JSONObject中;或它的超类( 'org.json.JSONObject‘的声明出现在/system/org.json.JSONObject/core-libart.jar中)。
No virtual method b()Z in class Lorg/json/JSONObject; or its super classes (declaration of 'org.json.JSONObject' appears in /system/framework/core-libart.jar)我不知道我为什么要得到这个。我已经读到过,这是由于与Android包含的JSON库发生冲突,但这只在纯Java库中使用,任何与Android的代码交互都涉及字符串或longs,而不是JSON
有人经历过这种事吗?或者,对于如何在这个纯java包中使用JSON有任何建议吗?
我尝试导入一个非常老版本的JSON库,以防由于某种冲突而使用更新的方法,但没有骰子。同样的错误。还尝试导入jar而不是使用gradle。
这用于ORMLITE中数据库的简单getter和setter。下面是一个示例,其中mExtraFlag是一个字符串。引起问题的方法有toString ( JSONObject )和valueToString、StringToValue等方法。
public JSONObject getExtraFlag() {
return new JSONObject(mExtraFlag);
}发布于 2019-07-30 18:43:33
对于任何经历过同样问题的人来说,这是我的黑客解决方案。我决定使用葛森
同样,我必须强调,这是针对解耦的包的。--如果您试图将JSON库导入到一个常规的Android包中,这可能不是您的解决方案。实际上,另一个答案可能适用于您。
格莱德尔:
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}Maven:
<dependencies>
<!-- Gson: Java to Json conversion -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
</dependencies>从字符串到json对象的示例解析
public JsonObject toJson(String value) {
return new JsonParser().parse(value).getAsJsonObject();
}
// (probably dosen't require a method)
public String fromJson(JsonObject json) {
return json.toString();
}如何创建并插入JSON对象:
JsonObject object = new JsonObject();
object.addProperty(key, value);获取长值的示例(mExtraFlag是字符串)
toJson(mExtraFlag).get(key).getAsLong();发布于 2020-03-05 13:30:45
我猜您的模糊化构建会引发异常(因为g(Ljava/lang/String;)Ljava/lang/Object;显然是模糊的)。
正如您正确地提到的,一些像org.json这样的java库已经由android提供了。如果您的组件想要使用特定库的不同(例如更新的)版本,那么这尤其是一个问题,但是android将简单地用android提供的版本替换您的导入,因此,如果调用仅在更新版本中可用的方法,则可能会引发java.lang.NoSuchMethodError。通常,解决此问题的方法是对包名进行阴影,使其不被替换。
但是,在您的情况下,错误版本的org.json似乎并不是一个问题。引发此错误是因为您的org.json包在您的构建中被混淆了,而混淆的方法g(...)当然不能在android的../core-libart.jar中找到。
您可能有几种解决此问题的选项:
.jar导入中使用的,那么它显然不是作为传递依赖处理的,因此,org.json将被作为一个不同于安卓的库来处理,因此org.json将被混淆。因此,您可以添加一个保护保持规则,如下所示:-keep class org.json.**
-keepclassmembers,includedescriptorclasses class org.json.** { *; }org.json进行遮挡,但是imo并不需要这样做,最终只能导入相同的库两次。添加另一个像gson这样的库可能是不必要的。
https://stackoverflow.com/questions/57274183
复制相似问题