簡體   English   中英

使用 org.json 將 XML 轉換為 JSON 時出現 NoSuchMethod 錯誤

[英]NoSuchMethod error when using org.json to convert XML to JSON

我的項目使用 Spring Boot 2.0.4。 我正在嘗試從文件中讀取 XML,然后將其轉換為 JSON。 這曾經有效,但最近它停止工作並拋出以下異常;

java.lang.NoSuchMethodError: org.json.JSONTokener.<init>(Ljava/io/Reader;)V
    at org.json.XMLTokener.<init>(XMLTokener.java:57) ~[json-20180813.jar:na]
    at org.json.XML.toJSONObject(XML.java:516) ~[json-20180813.jar:na]
    at org.json.XML.toJSONObject(XML.java:548) ~[json-20180813.jar:na]
    at org.json.XML.toJSONObject(XML.java:472) ~[json-20180813.jar:na]
    at com.zf.trw.visualisation.parser.handler.AttritionHandler.extractLineData(AttritionHandler.java:32) ~[classes/:na]
    at com.zf.trw.visualisation.parser.handler.HandlerImp.processFile(HandlerImp.java:79) ~[classes/:na]
    at com.zf.trw.visualisation.shared.service.ParserService.manuallyProcessAttritionData(ParserService.java:85) ~[classes/:na]
    at com.zf.trw.visualisation.parser.component.ScheduledTask.processAttritionDataFilesForAllLines(ScheduledTask.java:49) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_171]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]

我用來將 XML 轉換為 JSON 的代碼如下;

String fileContents = FileUtils.readFileToString(file, "UTF-8");
json = XML.toJSONObject(fileContents);

在我的 POM 文件中,我定義了這樣的依賴項;

<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180813</version>
        </dependency>

異常似乎表明它正在嘗試使用我在 POM 文件中指定的相同版本,這是最新版本。

為什么我看到這個錯誤?

為我們做以下工作,在 pom.xml 中,我們排除了定義自己的類 org.json.JSONObject 的這兩個依賴項: com.unboundid.components:jsoncom.unboundid.components:mimepull IE:

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web-services</artifactId>
        <exclusions>
            <exclusion>  <!-- declare the exclusion here -->
                <groupId>org.jvnet.mimepull</groupId>
                <artifactId>mimepull</artifactId>
            </exclusion>
        </exclusions>
        <version>${spring.boot.version}</version>
   </dependency>

或者,您也可以將 XML 轉換為 JSON,然后可以根據 JSON 模式驗證 JSON。

依賴:

<dependency>
    <groupId>com.github.fge</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>2.2.6</version>
</dependency>

代碼:

JsonNode node = JsonLoader.fromString(builder.toString());
JsonNode data = JsonLoader.fromString(serviceCreateJson.trim());
JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
JsonSchema sch = factory.getJsonSchema(node);
ProcessingReport report = sch.validate(data);
boolean isSuccess = report.isSuccess();

在我的情況下,這是因為依賴“spring-boot-starter-test”依賴於“android-json”。 排除后它起作用了:

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

我正在使用 20201115 版本的 json 依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM