首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:在纯java包中使用JSON库的问题

Android:在纯java包中使用JSON库的问题
EN

Stack Overflow用户
提问于 2019-07-30 14:35:16
回答 2查看 1.5K关注 0票数 4

我们的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中)。

代码语言:javascript
复制
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等方法。

代码语言:javascript
复制
public JSONObject getExtraFlag() {
 return new JSONObject(mExtraFlag);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-30 18:43:33

对于任何经历过同样问题的人来说,这是我的黑客解决方案。我决定使用葛森

同样,我必须强调,这是针对解耦的包的。--如果您试图将JSON库导入到一个常规的Android包中,这可能不是您的解决方案。实际上,另一个答案可能适用于您。

格莱德尔:

代码语言:javascript
复制
dependencies {
    implementation 'com.google.code.gson:gson:2.8.5'
}

Maven:

代码语言:javascript
复制
<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对象的示例解析

代码语言:javascript
复制
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对象:

代码语言:javascript
复制
JsonObject object = new JsonObject();
object.addProperty(key, value);

获取长值的示例(mExtraFlag是字符串)

代码语言:javascript
复制
toJson(mExtraFlag).get(key).getAsLong();
票数 1
EN

Stack Overflow用户

发布于 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中找到。

您可能有几种解决此问题的选项:

  • 如果您的解耦java包是从.jar导入中使用的,那么它显然不是作为传递依赖处理的,因此,org.json将被作为一个不同于安卓的库来处理,因此org.json将被混淆。因此,您可以添加一个保护保持规则,如下所示:
代码语言:javascript
复制
-keep class org.json.**
-keepclassmembers,includedescriptorclasses class org.json.** { *; }
  • 您可以尝试通过将库作为传递依赖处理来解决这个问题。
  • 您可以尝试在解耦的组件中对org.json进行遮挡,但是imo并不需要这样做,最终只能导入相同的库两次。

添加另一个像gson这样的库可能是不必要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57274183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档