Как запретить Java разделять строку JSON, переданную в качестве аргумента командной строки, на отдельные подблоки args []

Я хочу передать эту строку JSON в класс Java с помощью аргументов командной строки.

{"body": "Нам обязательно нужно встретиться, чувак", "startDate": "2014-05-29 11:00:00", "endDate": "2014-05-29 12:00:00", " location ":" Boca Raton "," subject ":" Это тема нашей встречи. "}

Однако в каждом пробеле строка разделяется. Итак, args [0] - это

{"тело":

args [1] - это

"We

и т.п.

Я хочу, чтобы args [0] был просто

{"body": "Нам обязательно нужно встретиться, чувак", "startDate": "2014-05-29 11:00:00", "endDate": "2014-05-29 12:00:00", " location ":" Boca Raton "," subject ":" Это тема нашей встречи. "}

Я пробовал использовать двойные кавычки, но поскольку в строке JSON есть кавычки, это не сработало.

Как я могу это сделать? Огромное спасибо!


person Ben Sandler    schedule 30.05.2014    source источник
comment
Это делает не Java, а командный процессор Windows / любого другого.   -  person Hot Licks    schedule 30.05.2014
comment
Вам нужно избежать json: stackoverflow.com/questions/3020094/   -  person luanjot    schedule 30.05.2014


Ответы (5)


Вот лучшее решение:

  1. Прекратите передавать json в качестве аргумента командной строки.
  2. Поместите json в файл.
  3. Передайте имя файла json в качестве аргумента командной строки.
  4. Прочтите файл json в своем приложении.
person DwB    schedule 30.05.2014
comment
Ваше решение может быть лучшим подходом, но производительность снижается, поскольку вы выполняете 2 системных вызова для записи / чтения файла. - person Maxime Flament; 25.09.2017
comment
Передача файла намного сложнее, а в некоторых случаях и невозможна, когда речь идет об автоматизации выполнения java-приложения. - person Barak BN; 06.05.2021

Это не проблема Java: это проблема оболочки. Так что ответ зависит от того, какую оболочку вы используете.

Если вы используете оболочку UNIX-y, попробуйте заключить JSON в одинарные кавычки. Например: java my.MainClass '{ "key1": "value1" }'. Возможно, это тоже сработает в Windows ... Я не уверен.

Если у вас есть ' в вашем JSON, все усложняется. Если ваша оболочка - Bash, один из вариантов - заменить каждый ' на '\''.

Но откуда берется JSON? Если вы действительно вызываете эту Java-программу из другой программы, вы можете вообще пропустить оболочку. subprocess.call в Python, IO.popen в Ruby, "$@" в Bash и ProcessBuilder в Java принимают массив аргументов командной строки вместо однострочной команды. В качестве альтернативы, логика, подобная Ruby Shellwords, существует практически для любого языка программирования и заключает в кавычки параметры командной строки, чтобы оболочка анализировала их точно по указанным вами байтам.

Другая альтернатива: вы можете передать 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)]

И прочтите его на Java, как описано в Чтение / преобразование InputStream в String - используя System.in в качестве InputStream.

person Adam Hooper    schedule 30.05.2014
comment
Я вызываю программу Java из программы Python. Как использовать subprocess.call? - person Ben Sandler; 30.05.2014
comment
@ adam-hopper Это сработало для меня, спасибо за предложение одинарной кавычки для оболочки bash. - person mihir6692; 01.06.2019

Вам нужно экранировать символы двойных кавычек и окружить всю строку обычными двойными кавычками:

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.

person Edwin Torres    schedule 30.05.2014

Оболочка удаляет двойные кавычки. Вместо этого вы можете использовать одинарные кавычки в 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);
person Gapmeister66    schedule 18.09.2016

Попробуйте закодировать свою строку JSON в base64:

{body: Нам обязательно нужно встретиться, чувак, startDate: 2014-05-29 11:00:00, endDate: 2014-05-29 12:00:00, location: Boca Raton, subject: Это тема нашего встреча.}

будет закодирован в

eyJib2R5IjogIldlIHNob3VsZCBkZWZpbml0ZWx5IG1lZXQgdXAsIG1hbiIsICJzdGFydERhdGUiOiAiMjAxNC0wNS0yOSAxMTowMDowMCIsICJlbmREYXRlIjogIjIwMTQtMDUtMjkgMTI6MDA6MDAiLCAibG9jYXRpb24iOiAiQm9jYSBSYXRvbiIsICJzdWJqZWN0IjogIlRoaXMgaXMgdGhlIHN1YmplY3Qgb2Ygb3VyIG1lZXRpbmcuIn0 =

Это исключило пробелы и другие проблемные символы.

Конечно, вам нужно будет декодировать его обратно внутри вашей программы, но это относительно легко сделать.

person Barak BN    schedule 01.06.2021