将json值转换为json的最有效方法是什么?

时间:2019-09-13 20:10:32

标签: json python-3.x string

我正在接受提供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()函数。 感谢任何帮助。

1 个答案:

答案 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]]