json.loads()返回一个字符串

时间:2019-06-24 11:23:41

标签: python json python-3.x python-3.6

为什么json.loads()返回一个字符串?这是我的代码:

$searchResultsArray = SearchResult
    ::getBySourceId($next_sourceId['source_id'])
    ->select( 'field', 'value' )
    ->get()
    ->mapWithKeys(function ($item) {
        return [$item['field'] => $item['value']];
    })
    ->all();

输出:

import json

d = """{
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}"""

j = json.loads(json.dumps(d))
print(type(j))

它不返回json对象吗?这里需要什么更改?

4 个答案:

答案 0 :(得分:3)

两点:

  1. 您的products键中有一个错字:"final_price": 40,应该是"final_price": 40(不带逗号)
  2. j应该是json.loads(d)

输出

  

dict

编辑

本文Can you use a trailing comma in a JSON object?

解释了为什么无法在json对象中使用逗号结尾的原因
  

很遗憾,JSON规范不允许使用逗号结尾。有几种浏览器可以使用它,但是通常您需要担心所有浏览器。

答案 1 :(得分:1)

ast.literal_eval :安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,字节,数字,元组,列表,字典,集合,布尔值,无,字节和集合。 more details

import ast

d = """{
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}"""

data = ast.literal_eval(d)

print(data)
print(type(data))

O / P:

{'reference': '123432', 'business_date': '2019-06-18', 'final_price': 40, 'products': [{'quantity': 4, 'original_price': 10, 'final_price': 40}]}
<class 'dict'>

答案 2 :(得分:1)

在您的代码中,d应该是JSON字符串。如果是这样,那么您就不需要在加载它之前将其转储。

当我删除字符串引号时,这意味着json.dumps调用正在处理非字符串的字典,一切似乎都很好:

import json

d = {
    "reference": "123432",
    "business_date": "2019-06-18",
    "final_price": 40,
    "products": [
        {
            "quantity": 4,
            "original_price": 10,
            "final_price": 40,
        }
    ]
}

j = json.loads(json.dumps(d))
print(type(j))

打印出

<class 'dict'>

但是请注意,尝试将json.loads应用于现有字符串会产生错误,因为JSON比Python宽容度小,并且不允许在列表和字典末尾悬挂逗号(请参见{ {1}}元素定义)。

答案 3 :(得分:1)

1)。 dj的类型将保持不变。

import json

d = """{
 "reference": "123432",
 "business_date": "2019-06-18",
 "final_price": 40,
 "products": [
    {
        "quantity": 4,
        "original_price": 10,
        "final_price": 40,
    }
    ]
}"""
print(type(d))

j = json.loads(json.dumps(d))
print(type(j))

2)。现在,两者都具有Dictionary类型:-

import json

d = {
 "reference": "123432",
 "business_date": "2019-06-18",
 "final_price": 40,
 "products": [
    {
        "quantity": 4,
        "original_price": 10,
        "final_price": 40,
    }
    ]
}
print(type(d))

j = json.loads(json.dumps(d))
print(type(j))

这就是我们使用json格式的原因。 希望对您有帮助。