当前位置: 首页 > 知识库问答 >
问题:

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

经佐
2023-03-14

nosuchmethoderror:没有静态方法g(ljava/lang/string;)ljava/lang/object;在类lorg/json/jsonObject中;或者它的超级类('org.json.jsonObject'的声明出现在/system/framework/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的任何代码交互都涉及字符串或长,而不是JSON

有人经历过吗?或者对于如何在这个纯java包中使用JSON有什么建议?

我尝试导入一个非常旧的JSON库版本,以防由于使用新方法时的某种冲突,但没有结果。同样的错误。也尝试导入jar而不是使用gradle。

这用于Ormlite中数据库的简单getter和setter。这里有一个例子,其中mExtraFlag是一个字符串。同样会导致问题的方法有来自JSOObject的toString和方法:valueToString、StringToValue等。

public JSONObject getExtraFlag() {
 return new JSONObject(mExtraFlag);
}

共有1个答案

微生俊材
2023-03-14

我想这个异常是为经过模糊处理的构建抛出的(因为g(ljava/lang/string;)ljava/lang/object;显然是经过模糊处理的)。

正如您正确提到的,Android已经提供了一些java lib,比如org.json。如果您的一个组件希望使用特定lib的不同版本(例如较新的版本),这尤其是一个问题,但是android会简单地用android提供的版本替换您的导入,因此,如果调用仅在较新版本中可用的方法,java.lang.NosuchMethoderRor可能会被抛出。通常,解决这个问题的方法是对包名称进行阴影处理,这样它就不会被替换。

但是,org.json的错误版本似乎不是您的问题。抛出该错误是因为您的org.json包在构建中被混淆了,并且混淆的方法g(...)当然不能在Android的../core-libart.jar中找到。

您可能有几种方法来解决此问题:

  • 如果从.jar导入中使用解耦的java包,那么它显然不作为传递依赖项处理,因此,org.json将作为不同于android使用的库来处理,因此org.json将被混淆。因此,您可以添加一个proguard keep规则,例如:
-keep class org.json.**
-keepclassmembers,includedescriptorclasses class org.json.** { *; }
  • 您可以尝试通过将库作为传递依赖项处理来解决此问题。
  • 您可以尝试在解耦组件中隐藏org.json,但在imo中这是不必要的,最终只会导致两次导入同一个库。
 类似资料:
  • 本文向大家介绍如何在Java中使用flexjson包装JSON?,包括了如何在Java中使用flexjson包装JSON?的使用技巧和注意事项,需要的朋友参考一下 该Flexjson库 是一个轻量级的 Java库,用于序列化和反序列化的Java bean,映射,数组,并集合 在一个JSON格式。一个JSONSerializer 是执行的Java序列化对象到JSON,默认情况下执行一个主类浅 序列化

  • 全部的我和你有一个很奇怪的问题https://github.com/json-path/JsonPath 其中一个问题似乎是实现中存在的重入问题:当执行路径时,每个片段返回一个字符串: 我通过将JSONObject/JSONArray传递给JsonPath.read()而不是JSON字符串来“黑客”。做完后,现在我得到了: 如您所见,这已经是一个数组。我在谷歌上搜索了很多次,但都找不到问题所在。

  • 我正在构建一个Flutter应用程序,我试图在网络上工作。其中一部分包含一些特定于web的代码: 但是, 导入会给出以下错误: 避免在 Flutter Web 插件包之外使用纯 Web 库 警告的较长版本如下所示: 避免在非网络插件的飘飘包中使用网页库、、。这些库在 Web 上下文之外不受支持。依赖于它们的功能在Flutter移动版的运行时会失败,并且在Flutter Web中通常不鼓励使用它们。

  • 本章介绍如何使用Java编程语言对JSON对象进行编码和解码。让我们从准备环境开始,使用Java for JSON开始编程。 环境 在开始使用Java编码和解码JSON之前,您需要安装任何可用的JSON模块。在本教程中,我们已经下载并安装了JSON.simple,并将json-simple-1.1.1.jar文件的位置添加到环境变量CLASSPATH中。 JSON和Java实体之间的映射 JSON

  • 问题内容: 我对angular有点陌生,我的json和ng-repeats遇到了问题。我有一个“模块”列表,然后是其中的“周”列表: 我的最终输出是一张表,我可以让模块重复,但是要让几周循环,我很难理解自己在做什么。这是我的模板: 这样将输出2个表,并带有正确的标题和描述,但是我似乎无法正确显示几周。请注意,某些“模块”有一个以上的“星期”。我不确定错误是否在模板或json中。 谢谢你的帮助。小号

  • 我的项目使用两个第三方库(大小都超过10MB)来实现一些语音处理功能。我一次只需要其中一个(就像插件一样),这是我在构建时做出的决定。到目前为止,我已经在同一个模块中使用了两个库的方法。我的身材。格拉德尔有这样的旗帜: buildConfigField“boolean”、“USE_LIB_ONE”、“true” buildConfigField“boolean”、“USE_LIB_TWO”、“fa