【问题标题】:JSON formatting adding \ characters when I append file, but not to string in outputJSON格式在我附加文件时添加\字符,但不是输出中的字符串
【发布时间】:2018-01-14 00:29:21
【问题描述】:

我正在使用以下函数从 flickr API 获取 json。它返回的字符串是格式正确的 JSON 块:

def get_photo_data(photo_id):
    para = {}
    para["photo_id"] = photo_id
    para["method"] = "flickr.photos.getInfo"
    para["format"] = "json"
    para["api_key"] = FLICKR_KEY
    request_data = params_unique_combination("https://api.flickr.com/services/rest/", para)

    if request_data in CACHE_DICTION:
        return CACHE_DICTION[request_data]
    else:
        response = requests.get("https://api.flickr.com/services/rest/", para)
        CACHE_DICTION[request_data] = response.text[14:-1]
        cache_file = open(CACHE_FNAME, 'w')
        cache_file.write(json.dumps(CACHE_DICTION))
        cache_file.close()
        return response.text[14:-1]

我遇到的问题是,当我将 json 写入缓存文件时,它会不断添加反斜杠,例如以下示例:

"https://api.flickr.com/services/rest/format-json_method-flickr.photos.getInfo_photo_id-34869402493": "{\"photo\":{\"id\":\"34869402493\",\"secret\":\"56fcf0342c\",\"server\":\"4057\",\"farm\":5,\"dateuploaded\":\"1499030213\",\"isfavorite\":0,\"license\":\"0\",\"safety_level\":\"0\",\"rotation\":0,\"originalsecret\":\"c4d1d316ed\",\"originalformat\":\"jpg\",\"owner\":{\"nsid\":\"150544082@N05\",\"username\":\"ankitrana_\",\"realname\":\"Ankit Rana\",\"location\":\"Cincinnati, USA\",\"iconserver\":\"4236\",\"iconfarm\":5,\"path_alias\":\"ankitrana_\"},\"title\":{\"_content\":\"7\"},\"description\":{\"_content\":\"\"},\"visibility\":{\"ispublic\":1,\"isfriend\":0,\"isfamily\":0},\"dates\":{\"posted\":\"1499030213\",\"taken\":\"2017-06-19 13:43:38\",\"takengranularity\":\"0\",\"takenunknown\":\"0\",\"lastupdate\":\"1499041020\"},\"views\":\"41\",\"editability\":{\"cancomment\":0,\"canaddmeta\":0},\"publiceditability\":{\"cancomment\":1,\"canaddmeta\":0},\"usage\":{\"candownload\":1,\"canblog\":0,\"canprint\":0,\"canshare\":1},\"comments\":{\"_content\":\"0\"},\"notes\":{\"note\":[]},\"people\":{\"haspeople\":0},\"tags\":{\"tag\":[{\"id\":\"150538742-34869402493-5630\",\"author\":\"150544082@N05\",\"authorname\":\"ankitrana_\",\"raw\":\"cincinnati\",\"_content\":\"cincinnati\",\"machine_tag\":0},{\"id\":\"150538742-34869402493-226\",\"author\":\"150544082@N05\",\"authorname\":\"ankitrana_\",\"raw\":\"ohio\",\"_content\":\"ohio\",\"machine_tag\":false}, ... etc., etc.}

如果没有这些额外的 \ 字符,我如何将 JSON 存储到现有文件中,因为它在我打印字符串时表示?

【问题讨论】:

  • edit 提出您的问题,以便我们可以运行并重新创建问题的MCVE

标签: python json formatting append flickr


【解决方案1】:

您可以尝试用python中的str.replace函数替换“\”

在下面一行之后添加代码

cache_file = open(CACHE_FNAME, 'w')

json_item = str(json.dumps(CACHE_DICTION))
json_item.replace("\", "")

并改变这一行

cache_file.write(json.dumps(CACHE_DICTION))

cache_file.write(json_item)

让我知道这是否适合你

【讨论】:

  • 这确实解决了问题,但我担心 json 包含合法反斜杠的情况。
  • 嗯,有道理,感谢您指出这一点。将来可能会对我有所帮助。
【解决方案2】:

使用your_string.decode('string_escape')\" 转义为"

更新:

你的字符串转义是因为json.dumps(),它将对象转换为字符串,稍后你可以使用json.loads() 读取它,结果未转义。

你可以使用str()保存它而不用斜线

cache_file.write(str(CACHE_DICTION))
# {'myparam' :'"162000","photo":...'

但是它用单引号保存到文件的问题,它不是有效的json并且与json.loads()不兼容

我的建议保持你的代码如上,除非你想将它存储到文件CACHE_FNAME.json

cache_file = open(CACHE_FNAME, 'w')
cache_file.write(response.text)
cache_file.close()
# {"photos":{"page":1,"pages":6478,..}

【讨论】:

  • 你能给我更多的信息吗?当我尝试使用响应文本创建一个字符串 var 然后使用 decode 它告诉我 decode 不能用于字符串。在转储之前,我尝试将 json 编码为 UTF-8,但也没有运气。这似乎可以解决我的问题,但我仍然是编程新手,所以我并不完全了解如何使用它。
  • 更新了答案,见上文。不需要.decode('string_escape'),因为斜线来自json.dumps()
  • 这是一个令人困惑的答案。执行 json.dumps(str(CACHE_DICTION)) 不会删除输出 json 中的反斜杠
【解决方案3】:

只需将\ 替换为空格即可。 我在使用 JSON 时也做了同样的事情。

json_new = json.replace('\\', '')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多