如何使用json库

时间:2016-06-04 13:51:16

标签: python json python-2.7

我有一个配置文件,我试图拆开然后重新组装更新的部分。配置文件采用json格式,我试图在插入另一个json文件之前将其组件提取出来进行更新。

我发现的问题是JSON文件的各个部分使用"\/",当使用python的JSON库解码时,我得到"/"。我将更新的值重新插入新的JSON文件后,我需要忠实地表示原始JSON,因此我需要缺少"\/"

我怀疑\被解释为转义并被JSON解码器删除。

以下是我目前的努力样本:

JSON字符串示例:

{"Markup\/0.xaml":"text\/xml; charset=utf-8; format=xml; clrtype=ESRI.ArcGIS.Client.Graphic","Markup\/1.xaml":"text\/xml; charset=utf-8; format=xml; clrtype=ESRI.ArcGIS.Client.Graphic"}

Python代码:

import json
with open(full_json_path_old, 'r+') as fo:
    data = json.load(fo) 
    print "DECODED STRING - ", data

打印结果:

u'Markup/0.xaml': u'text/xml; charset=utf-8; format=xml; clrtype=ESRI.ArcGIS.Client.Graphic',
u'Markup/1.xaml': u'text/xml; charset=utf-8; format=xml; clrtype=ESRI.ArcGIS.Client.Graphic'

1 个答案:

答案 0 :(得分:0)

是的,\反斜杠是一个转义字符,一个合适的JSON解码器会将这样的字符作为转义。 Python JSON解码器也不例外。见section 7 of RFC 7159

  

任何角色都可能被转义。

char = unescaped /
    escape (
        %x22 /          ; "    quotation mark  U+0022
        %x5C /          ; \    reverse solidus U+005C
        %x2F /          ; /    solidus         U+002F
        %x62 /          ; b    backspace       U+0008
        %x66 /          ; f    form feed       U+000C
        %x6E /          ; n    line feed       U+000A
        %x72 /          ; r    carriage return U+000D
        %x74 /          ; t    tab             U+0009
        %x75 4HEXDIG )  ; uXXXX                U+XXXX

escape = %x5C              ; \

(所以\/序列是 escape solidus 序列。)

您的输出正确;因为我希望mimetype组件如textxml由正斜杠分隔,而不是\/分隔。

正斜杠(标准中的固相)不会 进行转义。第7节说明必须转义的字符:

  

所有Unicode字符都可以放在      引号,必须转义的字符除外:      引号,反向实线和控制字符(U + 0000      通过U + 001F)。

因此,Python JSON编码器在生成JSON输出时不会转义正斜杠。