在org.json中使用JSONArray时出错

raogr8fs  于 2023-10-21  发布在  其他
关注(0)|答案(6)|浏览(118)

错误信息

java.lang.NoSuchMethodError:org.json.JSONArray.isEmpty()Z

我的场景

我尝试使用org.jsonJSONArray方法。
我使用IntelliJ作为IDE。我没有在代码中使用任何接近反射的东西。我声明了一个JSONArray,并在几行之后试图检查它是否为空,但是当我试图使用isEmpty()时,我得到了这个错误。
我确实通过使用jsonArray.length() > 0解决了这个问题,但是错误消息让我着迷。我查看了JSONArray的反编译的**.class文件,方法isEmpty()exists,并且有一个public access修饰符**。但是,InteliiJ建议我在键入代码时可以使用isEmpty()。那么,是什么原因导致了这个错误的发生呢?

代码示例

JSONArray filesJsonArray = new JSONArray();

JSONObject fileObject = new JSONObject();
fileObject.put("fileId",fileId);
fileObject.put("fileName",fileName);
fileObject.put("mimeType",mimeType);

filesJsonArray.put(fileObject);

if (!filesJsonArray.isEmpty()){ //the condition check here throws the error.
}

(为简洁起见,省略了捕获块)

我的导入

在我使用这段代码的课程中,这是我所有的导入

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.ByteBuffer;
import java.sql.*;
import java.util.Base64;
kcrjzv8t

kcrjzv8t1#

如果你使用的是 Spring Boot ,那么你可以试试这个:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.skyscreamer</groupId>
                <artifactId>jsonassert</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

它为我工作。

zaqlnxep

zaqlnxep2#

对于任何仍然在看这个的人来说,主要的问题是JSONAssert。
要确认,请使用您拥有的任何依赖关系图工具来验证JSONAssert是否正在添加“android-json”。
maven示例:

mvn dependency:tree

android-json提供了自己的org.json.* 对象实现,但这些实现并不是最新的。因此将它们作为JSONAssert依赖项排除。
maven示例:

<dependency>
   <groupId>org.skyscreamer</groupId>
   <artifactId>jsonassert</artifactId>
   <version>1.5.0</version>
   <scope>test</scope>
   <exclusions>
       <exclusion>
           <groupId>com.vaadin.external.google</groupId>
           <artifactId>android-json</artifactId>
       </exclusion>
   </exclusions>
</dependency>

这应该可以保存您从这个问题,同时让您使用伟大的输出JSONAssert!

mklgxw1f

mklgxw1f3#

你需要从 spring-boot-starter-test artifactId 中清理 org.json 依赖包,这里是如何清理任何依赖的(考虑到我使用的是 spring-boot-starter-parent 2.4.4)

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.vaadin.external.google</groupId>
                <artifactId>android-json</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.skyscreamer</groupId>
                <artifactId>jsonassert</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
cngwdvgl

cngwdvgl4#

我相信你在你的项目中

compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'

因为你好像混淆了两类人:org.json.JSONArrayorg.json.simple.JSONArray。第一个没有这种方法,第二个有。下面是这两个类的代码示例:
https://www.programcreek.com/java-api-examples/org.json.JSONArray
https://www.programcreek.com/java-api-examples/org.json.simple.JSONArray
因此,作为一个解决方案,我建议清理和重建项目。

vzgqcmou

vzgqcmou5#

在我添加到我的项目后,我得到了同样的错误:

<dependency>    
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-json-org</artifactId>
  <version>2.9.2</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.9.2</version>
</dependency>

在那之后,我清理和更新了依赖关系

<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180813</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.9.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-json-org</artifactId>
            <version>2.9.7</version>
            <exclusions>
                <exclusion>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

就不见了

bxfogqkk

bxfogqkk6#

我知道这是旧的,但张贴在情况下,这可能是有用的人。
下面是我更新的依赖项

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.vaadin.external.google</groupId>
      <artifactId>android-json</artifactId>
    </exclusion>
  </exclusions>
</dependency>

在我的例子中,使用了android-json中的JSONArray,而不是org.json.JSONArray,后者具有spliterator()抛出
Caused by: java.lang.NoSuchMethodError: org.json.JSONArray.spliterator()Ljava/util/Spliterator;
下面是抛出的代码

JSONArray someJsonArray = getSomeJsonArray();
  if (someJsonArray != null) {
    List<SecretEntry> secretEntries = (List)StreamSupport.stream(someJsonArray.spliterator(), false).map((obj) -> {
      return (JSONObject)obj;
...

而且,我不能排除org.skyscreamer.jsonassert,因为它正被andExpect(content().json(getJsonBody()))调用的assertJSONEqual()使用
这里是代码

private MockMvc mockMvc;

 @Inject
 private WebApplicationContext webApplicationContext;

 mockMvc = webAppContextSetup(webApplicationContext).build();
 MvcResult result = mockMvc.perform(
        get("basePath").header(
            "headerName", "headerValue")).andExpect(content().contentType("application/json"))
    .andExpect(status().isOk()).andExpect(content().json(getJsonBody())).andReturn();

}

相关问题