首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同命名实体的SimpleJson处理

相同命名实体的SimpleJson处理
EN

Stack Overflow用户
提问于 2011-10-20 01:13:58
回答 2查看 1.9K关注 0票数 4

我在应用程序引擎中使用Alchemy API,所以我使用simplejson库来解析响应。问题是响应的条目具有sme名称

代码语言:javascript
复制
 {
    "status": "OK",
    "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
    "url": "",
    "language": "english",
    "entities": [
        {
            "type": "Person",
            "relevance": "0.33",
            "count": "1",
            "text": "Michael Jordan",
            "disambiguated": {
                "name": "Michael Jordan",
                "subType": "Athlete",
                "subType": "AwardWinner",
                "subType": "BasketballPlayer",
                "subType": "HallOfFameInductee",
                "subType": "OlympicAthlete",
                "subType": "SportsLeagueAwardWinner",
                "subType": "FilmActor",
                "subType": "TVActor",
                "dbpedia": "http://dbpedia.org/resource/Michael_Jordan",
                "freebase": "http://rdf.freebase.com/ns/guid.9202a8c04000641f8000000000029161",
                "umbel": "http://umbel.org/umbel/ne/wikipedia/Michael_Jordan",
                "opencyc": "http://sw.opencyc.org/concept/Mx4rvViVq5wpEbGdrcN5Y29ycA",
                "yago": "http://mpii.de/yago/resource/Michael_Jordan"
            }
        }
    ]
}

所以问题是"subType“是重复的,所以加载返回的只是"TVActor”而不是列表。有什么办法可以绕过这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-20 05:51:32

定义application/jsonrfc 4627表示:

代码语言:javascript
复制
An object is an unordered collection of zero or more name/value pairs

和:

代码语言:javascript
复制
The names within an object SHOULD be unique.

这意味着AlchemyAPI不应该在同一个对象中返回多个"subType"名称,并声明它是一个JSON。

您可以尝试以XML格式(outputMode=xml)请求相同的内容,以避免结果中的歧义,或者将重复的键值转换为列表:

代码语言:javascript
复制
import simplejson as json
from collections import defaultdict

def multidict(ordered_pairs):
    """Convert duplicate keys values to lists."""
    # read all values into lists
    d = defaultdict(list)
    for k, v in ordered_pairs:
        d[k].append(v)

    # unpack lists that have only 1 item
    for k, v in d.items():
        if len(v) == 1:
            d[k] = v[0]
    return dict(d)

print json.JSONDecoder(object_pairs_hook=multidict).decode(text)

示例

代码语言:javascript
复制
text = """{
  "type": "Person",
  "subType": "Athlete",
  "subType": "AwardWinner"
}"""

输出

代码语言:javascript
复制
{u'subType': [u'Athlete', u'AwardWinner'], u'type': u'Person'}
票数 6
EN

Stack Overflow用户

发布于 2019-01-15 22:46:07

The rfc 4627 for application/json media type建议使用唯一键,但并未明确禁止:

对象中的名称应该是唯一的。

来自rfc 2119

应该推荐这个词,或者形容词“”,意思是

在特定情况下可能存在有效的理由来忽略

特定项目,但必须了解全部含义,并

在选择不同的课程之前仔细权衡过。

这是一个已知的问题。

您可以通过修改重复密钥来解决这个问题,也可以将其保存到数组中。如果您愿意,您可以使用此代码。

代码语言:javascript
复制
import json

def parse_object_pairs(pairs):
    """
    This function get list of tuple's
    and check if have duplicate keys.
    if have then return the pairs list itself.
    but if haven't return dict that contain pairs.

    >>> parse_object_pairs([("color": "red"), ("size": 3)])
    {"color": "red", "size": 3}

    >>> parse_object_pairs([("color": "red"), ("size": 3), ("color": "blue")])
    [("color": "red"), ("size": 3), ("color": "blue")]

    :param pairs: list of tuples.
    :return dict or list that contain pairs.
    """
    dict_without_duplicate = dict()
    for k, v in pairs:
        if k in dict_without_duplicate:
            return pairs
        else:
            dict_without_duplicate[k] = v

    return dict_without_duplicate

decoder = json.JSONDecoder(object_pairs_hook=parse_object_pairs)

str_json_can_be_with_duplicate_keys = '{"color": "red", "size": 3, "color": "red"}'

data_after_decode = decoder.decode(str_json_can_be_with_duplicate_keys)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7825261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档