如何阻止Java将传递的JSON字符串作为命令行参数分离为args[]的单独子单元

6

我想通过命令行参数将此JSON字符串传递给Java类。

{"body": "我们一定要见面,伙计", "startDate": "2014-05-29 11:00:00", "endDate": "2014-05-29 12:00:00", "location": "博卡拉顿", "subject": "这是我们会面的主题。"}

但是,在每个空格处,该字符串都会被分割。因此args [0]是

{"body":

args [1]是

"我们

等等。

我希望args [0]只是

{"body": "我们一定要见面,伙计", "startDate": "2014-05-29 11:00:00", "endDate": "2014-05-29 12:00:00", "location": "博卡拉顿", "subject": "这是我们会面的主题。"}

我尝试使用双引号,但由于JSON字符串中有引号,所以不起作用。

我该怎么办?非常感谢!


这不是Java在做那个,而是Windows/任何命令处理器。 - Hot Licks
1
你必须转义JSON:https://dev59.com/questions/b3A75IYBdhLWcg3w899J - luanjot
6个回答

10

以下是更好的解决方案:

  1. 停止将json作为命令行参数传递。
  2. 将json放在文件中。
  3. 将json文件名作为命令行参数传递。
  4. 在应用程序中读取json文件。

您的解决方案可能是更好的方法,但性能有所降低,因为您要进行两个系统调用来读/写文件。 - Maxime Flament
1
在处理Java应用程序执行自动化时,传递文件会更加复杂,甚至在某些情况下可能是不可能的。 - Barak BN

3

您需要转义双引号并用普通双引号将整个字符串括起来:

java Test "{\"body\": \"We should definitely meet up, man\", \"startDate\": \"2014-05-29 11:00:00\", \"endDate\": \"2014-05-29 12:00:00\", \"location\": \"Boca Raton\", \"subject\": \"This is the subject of our meeting.\"}"

这是一个Windows的示例。


简单而强大的答案。 - Neha Agarwal

2
这不是Java的问题,而是shell的问题。因此答案取决于您使用的shell。
如果您使用的是UNIX-y shell,请尝试将JSON放在单引号中。例如:java my.MainClass '{ "key1": "value1" }'。这在Windows上也可能有效...我不确定。
如果您的JSON中有',事情就会变得复杂。如果您的shell是Bash,则一种选择是将每个'替换为'\''
但是JSON来自哪里?如果您实际上是从另一个程序中调用此Java程序,则可以完全跳过shell。Python的subprocess.call、Ruby的IO.popen、Bash的"$@"和Java的ProcessBuilder都接受命令行参数的数组,而不是单个字符串命令。或者,类似于Ruby的Shellwords的逻辑存在于几乎所有编程语言中,并引用命令行参数,以便shell将它们解析为您指定的确切字节。
另一种选择:您可以将JSON传输到程序中。在UNIX上像这样调用它:
cat | java my.MainClass
{
  "you can just type": "this stuff",
  "and it will eventually get picked up by": "Java"
}
[Ctrl-d (UNIX) or Ctrl-z (Windows)]

按照读取/将InputStream转换为字符串中所述,在Java中读取它 -- 使用System.in作为InputStream


我正在从Python程序中调用Java程序。我该如何使用subprocess.call? - Ben Sandler
@adam-hopper 对我有用,感谢您建议在Bash shell中使用单引号。 - mihir6692

1

尝试使用base64对JSON字符串进行编码:

{"body": "We should definitely meet up, man", "startDate": "2014-05-29 11:00:00", "endDate": "2014-05-29 12:00:00", "location": "Boca Raton", "subject": "This is the subject of our meeting."}

将被编码为

eyJib2R5IjogIldlIHNob3VsZCBkZWZpbml0ZWx5IG1lZXQgdXAsIG1hbiIsICJzdGFydERhdGUiOiAiMjAxNC0wNS0yOSAxMTowMDowMCIsICJlbmREYXRlIjogIjIwMTQtMDUtMjkgMTI6MDA6MDAiLCAibG9jYXRpb24iOiAiQm9jYSBSYXRvbiIsICJzdWJqZWN0IjogIlRoaXMgaXMgdGhlIHN1YmplY3Qgb2Ygb3VyIG1lZXRpbmcuIn0=

这样可以消除空格和其他麻烦的字符。

当然,在您的程序中需要将其解码回来,但这相对容易实现。

0

Shell正在删除双引号。 相反,您可以在JSON中使用单引号,例如

{'networks':{'privateIP':'10.10.1.17','publicIP':'192.168.1.144'}}

然后使用以下方式解析:

ObjectMapper om = new ObjectMapper();
om.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
Networks n = om.readValue(args[0], Networks.class);

0
#!/bin/bash

JSON='
{
    "bbb":456,
    "aaaa": "SDFDS"
}
'
JSON=$(echo $JSON | sed s/\"/\\\"/g)
echo $JSON
java -Dmyparam="$JSON" Abc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接