【问题标题】:How to represent byte json string in Python如何在 Python 中表示字节 json 字符串
【发布时间】:2014-05-07 11:22:24
【问题描述】:

我正在使用 Python 和 Zookeeper,因为我在 Python 中使用 kazoo 库。这个问题与 Zookeeper 或 kazoo 库无关。我猜这主要与Python有关。

以下是我的两个变量 -

new_error_str = "Error occurred on machine %s in datacenter %s on the %s of process %s" % (host_info, local_dc, step, process_name)
new_error_key = "error_%s" % (timestamp_in_ms)

现在我需要使用这两个变量来创建一个字节 json 字符串,然后将该 json 字符串写入 Zookeeper 节点中的数据,所以下面是我们创建节点并写入数据的语法 -

zk.create(date_znode_path, b'{"'+new_error_key+'":"' + new_error_str + '"}', None, True)

不知何故,上面的行抛出了一个异常 -

TypeError: value must be a byte string

任何想法我在这里做错了什么?我正在尝试制作上述变量的 JSON 字符串。

这里是关于kazoo library的详细信息

更新:-

如果我使用这种语法,那么它可以正常工作 -

b'{"hostname":"' + get_hostname() + '"}', None, True)

我可以看到这样的数据 -

{"hostname":"machineA"}

【问题讨论】:

    标签: python json string byte kazoo


    【解决方案1】:

    你应该使用 json 模块:

    import json
    zk.create(date_znode_path, json.dumps({new_error_key : new_error_str}, ensure_ascii=True), None, True)
    

    手动构造json很棘手,如果输入包含引号怎么办?最好使用可以逃避一切并针对所有边缘情况进行良好测试的工具。

    【讨论】:

    • bytes 构造函数会在我传递一个字符串时引发错误。您可以将第二个encoding 参数传递给它,但使用str.encode 可能更清晰。
    • 我正在运行 Python 2.7.3 版,刚刚用一个示例更新了问题
    • 我调整了答案。当编码开始发挥作用时,手动构建 json 是很棘手的,最好只委托给为此而设计的工具,对吧? ;)
    • 这里使用ensure_ascii=True的目的是什么?
    • @SSH 比字节更保守,转义 128 范围之外的所有内容。可能是矫枉过正,但肯定不会受伤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多