首页 > 解决方案 > 解析错误 - Java 去除作为命令行参数发送的 JSON 字符串中的引号 (")

问题描述

我有一个批处理文件,它将 JSON 写入temp.txt文件并将此字符串作为命令行参数传递给 Java 应用程序。

批处理脚本:

java -jar "path/to/jar/MyJar.jar" > temp.txt
SET /p _json=<temp.txt

java -jar "path/to/jar/MyOtherJar.jar" %_json% 
PAUSE

MyJar.jar输出 JSON 并将其写入 并将JSONtemp.txt作为MyOtherJar参数。

JSON 看起来像这样:

{
    "Key1": "5d078",
    "Key2": "5d079",
    "list2": ["abc", "def"],
    "list1": ["xyz", "aaa"],
    "Size": 2
}

Java 应用程序尝试将接收到的字符串转换为JSONObject如下形式:

String jsonString = args[0];
try {
       JSONObject jsonObject = new JSONObject(jsonString);

    } catch (Exception e) {
            e.printStackTrace();
    }

但是当我执行批处理脚本时,我收到了这个错误:

org.json.JSONException: Expected a ',' or ']' at 78 [character 79 line 1]
        at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
        at org.json.JSONArray.<init>(JSONArray.java:127)
        at org.json.JSONTokener.nextValue(JSONTokener.java:366)
        at org.json.JSONObject.<init>(JSONObject.java:214)
        at org.json.JSONObject.<init>(JSONObject.java:321)
        at de.iese.MainClass.main(MainClass.java:17)

打印后,jsonString它显示整个字符串在没有双引号的情况下被解析,即,

{
    Key1: 5d078,
    Key2: 5d079,
    list2: [abc, def],
    list1: [xyz, aaa],
    Size: 2
}

有人可以解释为什么会这样吗?我对 cmd 脚本不是很熟悉,但是有没有办法绕过这种写入 txt 文件并直接存储这是一个变量并将其发送到MyOtherJar

标签: javajsonbatch-file

解决方案


考虑到您的输入文件test.txt包含:

{
    "Key1": "5d078",
    "Key2": "5d079",
    "list2": ["abc", "def"],
    "list1": ["xyz", "aaa"],
    "Size": 2
}

此 WIN 批处理脚本代码逐行读取输入文件,并附加到以下示例中名为data的变量。调用 Java 类/或可执行库时,将输入数据用双引号括起来,因为您的程序只读取一个参数(空格将跨越输入而不带双引号进入多个参数)。下面的例子只是运行一个独立的类来测试它,并使用“org.json”库依赖。

@echo off
set data=
for /f "tokens=*" %%a in (test.txt) do (
   call set "data=%%data%% %%a"
)
set CLASSPATH=.;json-20180813.jar
java test.JsonObjectConversion "%data%" 
pause

现在阅读程序将如下所示:

//single argument beaing read by Java
 String json = args[0];
 try {
    JSONObject jsonObject = new JSONObject(json);
    //object be read properly now
    System.out.println(jsonObject);
 } catch (Exception e) {
      //no exception should come here
 }

推荐阅读