【问题标题】:String to dict/json like format [duplicate]字符串到dict / json的格式[重复]
【发布时间】:2018-09-05 07:30:20
【问题描述】:

我发现很难将类似 json 的字符串转换为 json/dict 对象,我有这样的数据

{"key1":"value1","key2":[{"key2.1":"value2.1"},{"key2.2":"value2.2"}]}

在变量上运行 type 时,它告诉我它属于 str 类,即 <class 'str'>。我需要将字符串转换为 json 或 dict 之类的格式,以便提取所有名为 value 的值...

我试过json.loadsjson.loadjson.dumpsast.literal_eval,但似乎没有任何效果。我尝试在字符串的任一侧添加[''],但仍然没有运气。有任何想法吗?谢谢

编辑:

我正在使用nodeJS后端向flask服务器发送请求,nodeJS axios请求是这样的

get_values: (key_one, key_two) =>
  axios.post('http://localhost:5000/example', {
    key_one: key_one,
    key_two: key_two
  }).then(res => res.data),

在烧瓶方面我正在这样做

@app.route('/example', methods=["POST","OPTIONS"])
def example():
  convert_data = request.get_data()
  string_data = convert_data.decode('utf8').replace("'", '"')
  new_string = "'''" + string_data + "'''"
  print(json.loads(new_string))

然后我得到一个错误

【问题讨论】:

  • “似乎没有任何效果” - 它是如何失败的?你得到了什么? json.loadsast.literal_eval 应该都可以在您的示例输入中正常工作。你确定他们失败了吗?示例:json.loads('{"key1":"value1","key2":[{"key2.1":"value2.1"},{"key2.2":"value2.2"}]}') 产生预期的 dict
  • 你提供的{"key1":"value1","key2":[{"key2.1":"value2.1"},{"key2.2":"value2.2"}]}已经是dict了,为什么还要序列化呢?
  • @ShadowRanger 运行,输出很长,最后一行是json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  • @MaThMaX running print(my_string.get('key1')) 给出输出 AttributeError: 'str' object has no attribute 'get'
  • 我用s = '''{"key1":"value1","key2":[{"key2.1":"value2.1"},{"key2.2":"value2.2"}]}''' 运行json.loads(s)。没问题。

标签: python json node.js python-3.x flask


【解决方案1】:

我稍微修改了你的函数:

@app.route('/example', methods=["POST","OPTIONS"])
def example():
  convert_data = request.get_data()
  string_data = convert_data.decode('utf8')
  print(json.loads(string_data))

似乎string_data 已经是一个格式完美的 json 字符串,您可以将其传递给loads。我删除了用" 替换',这似乎是不必要的,并且肯定添加了''',这将使这个字符串成为Python 多行字符串文字语法,但肯定会破坏json 兼容性,这也是你的错误告诉你的:

json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

这应该更接近您想要的。否则,当你运行它时,让我知道 string_data 里面到底是什么。

【讨论】:

  • 它在最后一行遇到错误,第一行错误Error on request:,然后是关于随机库调用的相当大的错误,然后以raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)结束
  • 当运行 type(string_data) 我得到 <class 'str'> 并且输出是{"key1":"value1","key2":[{"key2.1":"value2.1"},{...
  • 实际上看起来不错。可能是编码问题……你试过string_data = request.get_data(as_text=True)吗?
  • 请求本身有效,尝试使用string_data['key1'] 得到错误TypeError: string indices must be integers。尝试string_data.get('key1') 有错误AttributeError: 'str' object has no attribute 'get'。尝试json.loads(string_data) 得到错误json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。我找到了一个使用正则表达式和其他方法来解决问题的解决方案,但我想仍然不是很好,使用request.form.get('key1') 不会崩溃,但它会打印None
  • Ofc string_data 是一个字符串,所以 getitem (dict-like) 访问都不起作用,但如果内容确实是一个有效的 json 字符串,用 json.loads 解析它应该没有问题.一定是有什么问题。你能给我看一个完整的print(string_data.__repr__())吗?
【解决方案2】:

不确定我是否正确理解了这个问题。但是,假设你有一个字符串如下:

var a = { “key1”:“value1”, “key2”:[{ “key2.1”:“value2.1” }, { “key2.2”:“value2.2” }] }

然后你可以这样做:

try {
  const dictionary = JSON.parse(a)

  console.log(dictionary.key1) // This will print value1

  Object.keys(dictionary).map((key) => {
    console.log(dictionary[key]);
  });

} catch(e){
    // do something with error here
}

【讨论】:

  • 不是python。
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多