我正在接受提供JSON值(列表,字符串或字典,或这三个的任意组合)的用户输入,并且想知道将这些值转换为JSON值列表的最有效方法是什么是。
我已经有多行的用户输入:
def read_input():
in = ""
while True:
try: line = input()
except EOFError: break
user_input += line
return in
这提供了所有json值的字符串。我面临的麻烦是如何将该字符串转换为json值的单个列表。我正在使用json.loads()转换为json。
例如,如果我尝试:
print(json.loads(read_input))
然后输入"cat"
作为输入,我得到:
cat
但是,如果我输入"cat" [2]
作为输入,则会出现错误:
Traceback (most recent call last):
File "test.py", line 16, in <module>
print(json.loads(read_multiline_input()))
File "C:\Users\mmv456\Anaconda3\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\mmv456\Anaconda3\lib\json\decoder.py", line 342, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 5 (char 4)
我希望输出为:["cat", [2]]
。
我意识到这不是标准的json,而是json值,但是对于您如何执行此操作的任何提示,我都非常感谢。本质上,我想获取json值的字符串,并按其对象划分每个对象,以便它们全部位于列表中,然后使用json.loads()函数。 感谢任何帮助。
答案 0 :(得分:0)
您可以尝试类似的操作:
import json
def read_stream():
data = []
while True:
usr_input = yield
if not usr_input:
print(json.dumps(data))
break
data.append(json.loads(usr_input))
stream = read_stream()
next(stream)
while True:
try:
stream.send(input("Enter value or press <enter> to stop: "))
except StopIteration:
break
示例输出:
nter value or press <enter> to stop: "cat"
Enter value or press <enter> to stop: [2]
Enter value or press <enter> to stop:
["cat", [2]]