用空格传递Python JSON参数

问题描述

我试图在命令提示符下将JSON作为参数传递给python脚本。如果JSON中的元素的值没有空格,则可以使用,但是如果有空格,则不能使用。

这是脚本

import json,sys,traceback
    if(len(sys.argv)>1):
    print(sys.argv[1])
    jsonInput = json.loads(sys.argv[1]);
    print(jsonInput['name'])
    print(jsonInput['kingdom'])
    print(jsonInput['slogan'])

在JSON下面作为power Shell中的参数传递。我的值中有空格,例如乔恩·雪诺

python C:\Users\user1\Desktop\myTest.py '{\"name\":\"Jon SNow\",\"kingdom\":\"Winterfell\",\"slogan\":\"King in the north\"}'

输出

python : Traceback (most recent call last):
At line:1 char:1
+ python C:\Users\kiran.patil\Desktop\myTest.py '{\"name\":\"Jon SNow\" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Traceback (most recent call last)::String) [],remoteexception
    + FullyQualifiedErrorId : NativeCommandError
 
  File "C:\Users\User\Desktop\myTest.py",line 5,in <module>
    jsonInput = json.loads(sys.argv[1]);
  File "C:\Program Files\python38\lib\json\__init__.py",line 357,in loads
    return _default_decoder.decode(s)
  File "C:\Program Files\python38\lib\json\decoder.py",line 337,in decode
    obj,end = self.raw_decode(s,idx=_w(s,0).end())
  File "C:\Program Files\python38\lib\json\decoder.py",line 353,in raw_decode
    obj,end = self.scan_once(s,idx)
json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 9 (char 8)

请任何建议对其进行修复。

解决方法

如果使用\",则表示引号也是双引号。在Windows上,封闭的单引号不起作用,因此2个选项是

# Linux + Windows
python script.py "{\"name\":\"Jon Snow\",\"kingdom\":\"Winterfell\",\"slogan\":\"King in theNorth\"}"

# Linux only
python script.py '{"name":"Jon Snow","kingdom":"Winterfell","slogan":"King in theNorth"}'

Powershell保护壳

python script.py '{""name"":""Jon Snow"",""kingdom"":""Winterfell"",""slogan"":""King in theNorth""}'
,

PowerShell 中:

  • 您尝试进行的 事实上没有任何根本错误 ,以逃避嵌入"字符为{{ 1}}调用外部程序(例如Python),尽管包含在引号的字符串中({{1 }}):

    • 由于 Windows PowerShell 中的其他错误(除了下面讨论的基本错误),此问题已在 PowerShell [核心]中修复。 ] v6 + ,带有\"的字符串仅在包含至少个空格字符的情况下转义。

    • 换句话说:在 PowerShell [Core] v6 + 中,您的命令可以按原样工作 ;在 Windows PowerShell 中,仅当您的字符串包含至少一个空格字符 时才有效。

    • 因为在这种特定情况下(仅!)'...'\"是可互换的,并且\"的使用也适用于空格-azro's helpful answer中所示,在Windows PowerShell中,使用 ""进行转义的字符串较少> 是更可靠的选择。 Windows上的 caveat 是大多数(但不是全部)CLI将""识别为转义的""字符,而那些没有的CLI识别""

"
  • 应该出了问题,但是,因为您不必逃脱\"个字符。在# OK even in Windows PowerShell,due to the string containing spaces. # "" instead of \" works too and avoids the need for spaces in Windows PowerShell # - but neither should be necessary (see below). python myTest.py '{\"name\": \"Jon Snow\",\"kingdom\": \"Winterfell\",\"slogan\": \"King in the North\"}' 分隔的字符串文字中,它是一个 verbatim string literal in PowerShell

    • 实际上,如果您调用 PowerShell-native 命令,您不需要;例如:
      "可以正常工作。

    • 由于一个长期存在的错误,不幸的是,您必须在调用外部程序时执行此操作-尚未解决的某些问题,目的是不破坏向后兼容性-请参阅this answer了解背景信息和将来可能的解决方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...