python - 如果我想将两个 JSON 元素放入新字典中,如何保持 JSON 的顺序

标签 python json

我想从网页中获取基于每种产品 URL 的 shopid 和价格。从 JSON 加载仅包含两个 JSON 元素的有序字典。我传入加载 OrderedDict 参数并根据元素对 json 加载进行排序。我执行以下操作,但最终的有序字典不按顺序。还有其他办法吗?

mystr = [{"id":36887154,"final_price":1986.05,"payment_method_cost":"\\u003cem\\u003e+ 3,00 €\\u003c/em\\u003e \\u003cspan\\u003eΑντικαταβολή\\u003c/span\\u003e","net_price":1983.05,"net_price_formatted":"1.983,05 €","final_price_formatted":"1.986,05 €","shop_id":514,"no_credit_card":false,"sorting_score":[-4.8549,-340,-83,514,40],"shipping_cost":"\\u003cem\\u003e+ 0,00 €\\u003c/em\\u003e \\u003cspan\\u003eΜεταφορικά\\u003c/span\\u003e","link":"/products/show/36887154"},{"id":37336259,"final_price":1825.0,"payment_method_cost":"\\u003cem\\u003e+ 2,00 €\\u003c/em\\u003e \\u003cspan\\u003eΑντικαταβολή\\u003c/span\\u003e","net_price":1819.0,"net_price_formatted":"1.819,00 €","final_price_formatted":"1.825,00 €","shop_id":597,"no_credit_card":false,"sorting_score":[-4.71702,-57,-95,597,40],"shipping_cost":"\\u003cem\\u003e+ 4,00 €\\u003c/em\\u003e \\u003cspan\\u003eΜεταφορικά\\u003c/span\\u003e","link":"/products/show/37336259"}]

 fp = urllib.request.urlopen(url2besearched)
 mybytes = fp.read()
 mystr = mybytes.decode("utf8")
 fp.close()
 mystr = mystr.rsplit('=')
 mystr = mystr[1].split(";")
 mystr = mystr[0]


 if mystr.endswith("]"):
        json_str = json.loads(mystr, object_pairs_hook=OrderedDict)
        #sort json list
        json_str.sort(key=lambda s: s['final_price'])
        #get first
        spid = json_str[0]['shop_id']
        fprice = json_str[0]['final_price']
 else:
        mystr = json.dumps(mystr)
        json_str = json.loads(mystr, object_pairs_hook=OrderedDict)
        json_str.sort(key=lambda s: s['final_price'])
        #get first
        spid = json_str[0]['shop_id']
        fprice = json_str[0]['final_price']

i =0
json_dict = OrderedDict()    
for i in range(len(json_str)):
    key = json_str[i]["shop_id"]
    value = json_str[i]["final_price"]
    json_dict.update( {key : value} )

我想根据最终价格按升序获得 shop_id 和 Final_price 的有序字典,但我有两个主要问题

json_dict 顺序不正确 我从 mystr 收到错误,该 str 没有属性排序

最佳答案

OrderedDict 旨在保持条目的添加顺序。这里不需要,你需要根据最终价格对字典进行排序:

payments = json.loads(mystr)
final_prices = sorted([
    (payment['shop_id'], payment['final_price'])
    for payment in payments
], key=lambda payment: payment[1])

如果由于某种原因,您仍然需要一个 OrderedDict,您可以这样做:

OrderedDict(final_prices) 

关于python - 如果我想将两个 JSON 元素放入新字典中,如何保持 JSON 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064583/

相关文章:

python - python中的表类数据结构

javascript - 哈希键会自动转换为 int 吗?

java - 代码设计 : JSON from Socket to custom handler class

ios - 我需要获取 API token 才能从 Jetpack API 获取 JSON 数据吗?

python - 在 numpy 数组中绘制多边形

python - 在Python中计算较小的数字

javascript - 循环json数据然后用php发送到数据库

python - python中判断JSON解析是否成功

python - 动态生成具有唯一名称的字典条目

java - 压缩/序列化/操作大量数据的有效方法