从元组列表中格式化 JSON 字符串的更 Pythonic 方式
Posted
技术标签:
【中文标题】从元组列表中格式化 JSON 字符串的更 Pythonic 方式【英文标题】:more pythonic way to format a JSON string from a list of tuples 【发布时间】:2012-11-25 12:16:23 【问题描述】:目前我正在这样做:
def getJSONString(lst):
join = ""
rs = ""
for i in lst:
rs += join + '"' + str(i[0]) + '":"' + str(i[1]) + '"'
join = ","
return rs + ""
我称之为:
rs = getJSONString([("name", "value"), ("name2", "value2")])
它不需要嵌套(它只是一个简单的名称值对列表)。但我愿意以不同的方式调用该函数。这一切似乎有点笨拙,有没有更优雅的方式?这需要在 2.x 下运行。
请注意,这不是 Python - convert list of tuples to string 的重复项(除非可以修改该答案以创建 JSON 字符串作为输出)。
编辑:将名称值对作为字典传递会更好吗?
【问题讨论】:
【参考方案1】:有一种更好的方法来生成 JSON 字符串:json
module。
import json
rs = json.dumps(dict(lst))
这利用了 dict()
可以采用一系列键值对(双值元组)并将其转换为映射,json
模块直接将其转换为 JSON 对象结构这一事实。
演示:
>>> import json
>>> lst = [("name", "value"), ("name2", "value2")]
>>> rs = json.dumps(dict(lst))
>>> print rs
"name2": "value2", "name": "value"
【讨论】:
('datetime.datetime(2012, 12, 7, 10, 53, 22) is not JSON serializable',) - 这是否意味着我所有的值都必须是字符串? (如果他们这样做了,有什么好方法可以实现吗?) @cskilbeck:是的,datetime
对象没有默认序列化为 JSON。您需要手动将它们转换为字符串。
@cskilbeck:见JSON datetime between Python and javascript
原始输入列表可能有多个具有相同第一个元素的元组。如果这被转换为字典,它们将被覆盖
@mustafa: 但是如果你必须有一个带有重复键的 JSON 对象,那么使用''.format(','.join([':'.format(json.dumps(k), json.dumps(v)) for k, v in lst]))
至少使用json
模块格式化键和值(或者使用 Python 时使用f"','.join([f'json.dumps(k):json.dumps(v)' for k, v in lst])"
3.6 或更高版本)。考虑到使用此输出的任何人也必须明确支持重复键。【参考方案2】:
(lambda lst: json.dumps(item[0]:item[1] for item in lst))([(1,2), (3,4)])
【讨论】:
如果你喜欢 lambdas,我会这样做item[0]:item[1] for item in lst == dict(lst)
【参考方案3】:
您可以将其转换为一个完整的 JSON 内容:
import ast
import json
stli = '[(\'Rated 4.0\', \'RATED\\n A beautiful place to dine in.The interiors take you back to the Mughal era. The lightings are just perfect.We went there on the occasion of Christmas and so they had only limited items available. But the taste and service was not compromised at all.The only complaint is that the breads could have been better.Would surely like to come here again.\'), (\'Rated 4.0\', \'RATED\\n I was here for dinner with my family on a weekday. The restaurant was completely empty. Ambience is good with some good old hindi music. Seating arrangement are good too. We ordered masala papad, panner and baby corn starters, lemon and corrionder soup, butter roti, olive and chilli paratha. Food was fresh and good, service is good too. Good for family hangout.\\nCheers\'), (\'Rated 2.0\', \'RATED\\n Its a restaurant near to Banashankari BDA. Me along with few of my office friends visited to have buffet but unfortunately they only provide veg buffet. On inquiring they said this place is mostly visited by vegetarians. Anyways we ordered ala carte items which took ages to come. Food was ok ok. Definitely not visiting anymore.\'), (\'Rated 4.0\', \'RATED\\n We went here on a weekend and one of us had the buffet while two of us took Ala Carte. Firstly the ambience and service of this place is great! The buffet had a lot of items and the good was good. We had a Pumpkin Halwa intm the dessert which was amazing. Must try! The kulchas are great here. Cheers!\'), (\'Rated 5.0\', \'RATED\\n The best thing about the place is itÃ\x83Â\x82Ã\x82Â\x92s ambiance. Second best thing was yummy ? food. We try buffet and buffet food was not disappointed us.\\nTest ?. ?? ?? ?? ?? ??\\nQuality ?. ??????????.\\nService: Staff was very professional and friendly.\\n\\nOverall experience was excellent.\\n\\nsubirmajumder85.wixsite.com\'), (\'Rated 5.0\', \'RATED\\n Great food and pleasant ambience. Expensive but Coll place to chill and relax......\\n\\nService is really very very good and friendly staff...\\n\\nFood : 5/5\\nService : 5/5\\nAmbience :5/5\\nOverall :5/5\'), (\'Rated 4.0\', \'RATED\\n Good ambience with tasty food.\\nCheese chilli paratha with Bhutta palak methi curry is a good combo.\\nLemon Chicken in the starters is a must try item.\\nEgg fried rice was also quite tasty.\\nIn the mocktails, recommend "Alice in Junoon". Do not miss it.\'), (\'Rated 4.0\', \'RATED\\n You canÃ\x83Â\x82Ã\x82Â\x92t go wrong with Jalsa. Never been a fan of their buffet and thus always order alacarteÃ\x83Â\x82Ã\x82Â\x92. Service at times can be on the slower side but food is worth the wait.\'), (\'Rated 5.0\', \'RATED\\n Overdelighted by the service and food provided at this place. A royal and ethnic atmosphere builds a strong essence of being in India and also the quality and taste of food is truly authentic. I would totally recommend to visit this place once.\'), (\'Rated 4.0\', \'RATED\\n The place is nice and comfortable. Food wise all jalea outlets maintain a good standard. The soya chaap was a standout dish. Clearly one of trademark dish as per me and a must try.\\n\\nThe only concern is the parking. It very congested and limited to just 5cars. The basement parking is very steep and makes it cumbersome\'), (\'Rated 4.0\', \'RATED\\n The place is nice and comfortable. Food wise all jalea outlets maintain a good standard. The soya chaap was a standout dish. Clearly one of trademark dish as per me and a must try.\\n\\nThe only concern is the parking. It very congested and limited to just 5cars. The basement parking is very steep and makes it cumbersome\'), (\'Rated 4.0\', \'RATED\\n The place is nice and comfortable. Food wise all jalea outlets maintain a good standard. The soya chaap was a standout dish. Clearly one of trademark dish as per me and a must try.\\n\\nThe only concern is the parking. It very congested and limited to just 5cars. The basement parking is very steep and makes it cumbersome\')]'
inputlist = list(ast.literal_eval(stli))
rs = json.dumps(dict(inputlist))
print(rs)
输出:
"Rated 4.0": "RATED\n The place is nice and comfortable. Food wise all jalea outlets maintain a good standard. The soya chaap was a standout dish. Clearly one of trademark dish as per me and a must try.\n\nThe only concern is the parking. It very congested and limited to just 5cars. The basement parking is very steep and makes it cumbersome", "Rated 2.0": "RATED\n Its a restaurant near to Banashankari BDA. Me along with few of my office friends visited to have buffet but unfortunately they only provide veg buffet. On inquiring they said this place is mostly visited by vegetarians. Anyways we ordered ala carte items which took ages to come. Food was ok ok. Definitely not visiting anymore.", "Rated 5.0": "RATED\n Overdelighted by the service and food provided at this place. A royal and ethnic atmosphere builds a strong essence of being in India and also the quality and taste of food is truly authentic. I would totally recommend to visit this place once."
【讨论】:
【参考方案4】:我认为这是一个非常简单的解决方案。礼貌 w3 学校 https://www.w3schools.com/python/python_json.asp
import json
一些 JSON:
x = ' "name":"John", "age":30, "city":"New York"'
解析 x:
y = json.loads(x)
结果是一个 Python 字典:
print(y["age"])
【讨论】:
感谢 Karan,w3schools 确实很棒,尽管它解析一些 JSON,而不是格式化字典以输出。以上是关于从元组列表中格式化 JSON 字符串的更 Pythonic 方式的主要内容,如果未能解决你的问题,请参考以下文章