【问题标题】:ast.literal_eval throwing ValueError [duplicate]ast.literal_eval 抛出 ValueError [重复]
【发布时间】:2016-01-24 09:48:40
【问题描述】:

ast.literal_eval 正在为以下 JSON 抛出 ValueError: malformed string。 我无法发现错误是什么。我使用了在线 JSON 验证器,都提到这是一个有效的 JSON。

谁能帮我找出这个字符串的错误?

{
    "business_id": "Iu-oeVzv8ZgP18NIB0UMqg",
    "full_address": "3320 S Hill St,South East LA,Los Angeles, CA 90007",
    "schools": [
        "University of Southern California"
    ],
    "open": true,
    "categories": [
        "Medical Centers",
        "Health and Medical"
    ],
    "photo_url": "http://s3-media1.ak.yelpcdn.com/bphoto/SdUWxREuWuPvvot6faxfXg/ms.jpg",
    "city": "Los Angeles",
    "review_count": 2,
    "name": "Southern California Medical Group",
    "neighborhoods": [
        "South East LA"
    ],
    "url": "http://www.yelp.com/biz/southern-california-medical-group-los-angeles",
    "longitude": -118.274281,
    "state": "CA",
    "stars": 3.5,
    "latitude": 34.01971,
    "type": "business"
}

【问题讨论】:

    标签: python json string literals


    【解决方案1】:

    true 在 Python 中是无效的文字:

    In [2]: ast.literal_eval('true')
    ValueError: malformed node or string: <_ast.Name object at 0x7f32a096d550>
    

    当您需要反序列化 JSON 文档时,请使用 json 模块(特别是 json.loads)。

    【讨论】:

    • 这是对的。 true 和 false 在 Literal Eval 中无效。一旦我用正确的字符串替换了它们,它就起作用了。
    【解决方案2】:

    您在这里使用了错误的工具 - ast.literal_eval 用于将 python 文字 从字符串解析为 python 对象。它不适用于将数据从序列化 JSON 加载到 python 中(尽管它也可能适用于部分情况,因为序列化 json 格式有时会与 python 语法重叠)。

    也许您正在寻找json.loads

    【讨论】:

    • ast.literal_evaljson.loads 支持的输入的复杂度大致相同。这不像ast.literal_eval 仅限于单个令牌甚至任何固定级别的嵌套。重要的是它们的格式不同。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多