首頁  >  問答  >  主體

python - 使用json.loads,key不带引号,且value中可能含有“:”,如何最好地处理?

例如:

'''{
    colorSize: [{
        "Color": "超窄边IPS",
        "SkuId": 1365289,
        "Size": "27英寸"
    }, {
        "Color": "21:9超宽IPS曲面",
        "SkuId": 1742140,
        "Size": "29英寸"
    }, {
        "Color": "17英寸(TN,5:4方屏)",
        "SkuId": 1032147,
        "Size": "17英寸"
    }],
    warestatus: 1,
    shangjiazizhi: false
}'''

为了给key加双引号,必需先选中之
因为内容带有“:”,

  1. (\w+):,误处理"21:9超宽IPS曲面"

  2. [{,]\s*(\w+):,误处理"17英寸(TN,5:4方屏)"

有什么比较好的处理方法呢?

怪我咯怪我咯2740 天前812

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-18 09:18:41

    可以使用demjson https://github.com/dmeranda/d...

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:18:41

    兩種方案
    一種像@raidou說的使用demjson
    一種使用pyexecjs
    上程式碼

    import execjs
    import demjson
    
    str = '''
    {
        colorSize: [{
            "Color": "超窄边IPS",
            "SkuId": 1365289,
            "Size": "27英寸"
        }, {
            "Color": "21:9超宽IPS曲面",
            "SkuId": 1742140,
            "Size": "29英寸"
        }, {
            "Color": "17英寸(TN,5:4方屏)",
            "SkuId": 1032147,
            "Size": "17英寸"
        }],
        warestatus: 1,
        shangjiazizhi: false
    }
    '''
    print demjson.decode(str)
    print execjs.eval(str)

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:18:41

    手機版不能看到完整標題,能回覆一下嗎
    手機版還不能回覆評論,惱火
    更新一下,前面匹配一個空格

    \s([^"]+):

    或前面匹配一個行首

    ^([^"]+):

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:18:41

    自己解決了,簡單說一下:
    最關鍵是這些喪心病狂的:号必然出现在成对的"

    因為雙引號總是成對出現且不交叉
    用re.sub 把成對的雙引號過濾,然後濾出結果交給函數處理:將雙引號中間的冒號替換成特殊字符,為了描述方便我把這個字元稱為

    再用之前帶冒號的正規處理替換後不帶內容冒號的結果

    那麼新問題來了,key加好雙引號之後,假如我要把 替换回:,那么 替換回:,那麼 選什麼特殊字元最妥呢?

    🎜

    回覆
    0
  • 取消回覆