python - 数据库提取出的数据转json
PHP中文网
PHP中文网 2017-04-18 09:28:56
0
2
757

我从数据库中取出两列数据得到

data = [['美国', 46], ['英国', 27], ['中国', 26]]

如何转换为json格式的文件

{
    {
        name: '美国',
        value: 46
    },
    {
        name: '英国',
        value: 27
    },
    {
        name: '中国',
        value: 26
    },
}

求相关的python代码。最好能附上注释,本人初学者,多包涵,真的不是很会这个问题。

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
Ty80

我覺得你要的結果有可能是:

[
    {
        "name": "美国",
        "value": 46
    },
    {
        "name": "英国",
        "value": 27
    },
    {
        "name": "中国",
        "value": 26
    }
]

或:

{
    "data": [
        {
            "name": "美国",
            "value": 46
        },
        {
            "name": "英国",
            "value": 27
        },
        {
            "name": "中国",
            "value": 26
        }
    ]
}
import json


def convert_to_json_string_1(data):
    return json.dumps([{'name': i[0], 'value': i[1]} for i in data], indent=4)
    
def convert_to_json_string_2(data):
    return json.dumps({'data': [{'name': i[0], 'value': i[1]} for i in data]}, indent=4)

json格式其實是把Python物件序列化到一個純文字檔案中(針對Python來說)
json.dumps函數把一個python物件轉換(序列化)成json字串,indent意思是使用4個空格來縮進,這個字串也就是正常的字串,你可以:

with open('some-file.json', 'w') as handle:
    handle.write(convert_to_json_string_1(data)

對於初學者上面的程式碼有可能不是很好理解,下面把第一個函數寫的白痴一點:

def convert_to_json_string_1(data):
    ret = []  # 需要序列化的列表
    for i in data:
        tmp = {'name': i[0], 'value': i[1]}  # 通过data的每一个元素构造一个字典
        ret.append(tmp)
    ret = json.dumps(ret, indent=4)
    return ret
Ty80

關於問題

@pylego 有點出一個問題, 你的輸出範例並非標準的json (關於json 的標準定義請參照:Introducing JSON), {} 是js 的object, 類似於Python 的dictionary, 他應該是由鍵值對組成的, 你給的範例:

{
    {
        name: '美国',
        value: 46
    },
    {
        name: '英国',
        value: 27
    },
    {
        name: '中国',
        value: 26
    },
}

顯然不合規定, 所以猜測:

[
    {
        "name": "美国",
        "value": 46
    },
    {
        "name": "英国",
        "value": 27
    },
    {
        "name": "中国",
        "value": 26
    }
]

才是你要的。

作法

import json

data = [['美国', 46], ['英国', 27], ['中国', 26]]
names = 'name value'.split()

data = [dict(zip(names, d)) for d in data]

with open('out.json', 'w') as writer:
    json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False) 
    print(json_data, file=writer)

作法方面應該大家的方法都大同小異, 大致上分成三個部分:

  • data 轉為想要的形式: list of dictionary

  • 利用 json module 將 json module 將 data 轉為 json_data 轉為 json_data

  • 寫到文件裡

(1) 將 data 轉為想要的形式: list of dictionary

第一部分的做法差異比較大, 我選擇先製造出 names 這個 list:

names = 'name value'.split()

其實這跟:

names = ['name', 'value']

是一樣的, 但是我滿喜歡使用 split 的作法的, 寫起來比較快 (項目多的時候才不會要打那麼多的引號)。

接著我利用一個 list comprehension 去製造 list of dictionary:

data = [dict(zip(names, d)) for d in data]

先使用 for d in data 來迭代 for d in data 來迭代 data 中的一個一個 pair, 然後使用 zip 中的一個一個 pair, 然後使用 zip 去將專案名稱跟對應的值結合在一起:

# zip
'美国',  46
   |     |      =>  ('name', '美国'), ('value', 46)
'name'  'value'

然後 dict 可以吃進一個 iterables (每個項目是一個鍵值對, 比如一個二元素的 tuple), 製造出一個字典。

(2) 利用 json module 將 json module 將 data 轉為 json_data 轉為 json_data

第二部, 轉出 json_data, 這相當容易, 使用 dumps 就做得到了, 請參閱 json.dumps

json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False) 
  • sort_keys: 會排序 json 中 object 裡面的 key, 可設定可不設定

  • indent: 設定縮排

  • separators: 設定 json 輸出的分隔符號, ',' 用於分隔項目, ': ' 用於分隔鍵與值

  • ensure_ascii: 設為 False, 讓列印的時候不要使用 unicode 轉義

(3) 寫到文件裡

沒什麼特別的, 使用 with 處理文件開關, 利用 print(file=XXX) 輸出


我回答過的問題: Python-QA

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板