Python json.loads对象_hook=OrderedDict不工作
我有以下json文件:Python json.loads对象_hook=OrderedDict不工作,python,json,Python,Json,我有以下json文件: { "glossary": { "title": "example glossary", "GlossaryID": "5302", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "St
{
"glossary": {
"title": "example glossary",
"GlossaryID": "5302",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": [
"GML",
"XML"
]
},
"GlossSee": "markup"
}
}
}
}
}
我正在使用以下命令读取此json文件:
data=json.load(str,object\u hook=OrderedDict)
但是,它仍然不能保持插入顺序:
OrderedDict([
(u'glossary',
OrderedDict([
(u'GlossDiv',
OrderedDict([
(u'GlossList',
OrderedDict([
(u'GlossEntry',
OrderedDict([
(u'GlossDef',
OrderedDict([
(u'GlossSeeAlso',
[
u'GML',
u'XML'
]),
(u'para',
u'A meta-markup language, used to create markup languages such as DocBook.')
])),
(u'GlossSee',
u'markup'),
(u'Acronym',
u'SGML'),
(u'GlossTerm',
u'Standard Generalized Markup Language'),
(u'Abbrev',
u'ISO 8879:1986'),
(u'SortAs',
u'SGML'),
(u'ID',
u'SGML')
]))
])),
(u'title',
u'S')
])),
(u'GlossaryID',
u'5302'),
(u'title',
u'example glossary')
]))
])
我正在遍历字典中的项目,列出根元素及其元素。我希望它的顺序与json文件中的顺序相同
我在json中寻找结构和数组,每个数组或结构对我来说都是一个不同的表。 因此,我希望输出为:
Glossary-
title:example glossary,
GlossaryID:5302
GlossDiv-
title:S
GlossEntry-
ID: SGML,
SortAs: SGML,
GlossTerm: Standard Generalized Markup Language,
Acronym: SGML,
Abbrev: ISO 8879:1986,
GlossSee: markup
等等。
但是,因为它不能维持秩序,我认为:
glossary
GlossDiv
GlossList
GlossEntry
GlossDef
GlossSeeAlso
para : A meta-markup language, used to create markup languages such as DocBook.
GlossSee : markup
Acronym : SGML
GlossTerm : Standard Generalized Markup Language
Abbrev : ISO 8879:1986
SortAs : SGML
ID : SGML
title : S
GlossaryID : 5302
title : example glossary
根据文件: object_hook是一个可选函数,它将在任何对象文本解码(dict)的结果中调用。将使用object_hook的返回值代替dict 因此,正如您所理解的-此转换发生在
load
函数的末尾,这意味着输出不会“有序”,因为它从load
整体接收dict
OrderedDict
仅保留在声明“Ordered”后输入到OrderedDict
的键和值的顺序
因此,基本上钩子是可以工作的——但没有你想象的那样。:) 根据文件: object_hook是一个可选函数,它将在任何对象文本解码(dict)的结果中调用。将使用object_hook的返回值代替dict 因此,正如您所理解的-此转换发生在
load
函数的末尾,这意味着输出不会“有序”,因为它从load
整体接收dict
OrderedDict
仅保留在声明“Ordered”后输入到OrderedDict
的键和值的顺序
因此,基本上钩子是可以工作的——但没有你想象的那样。:) 使用
object\u hook
参数时,解码器将首先将映射重建为普通dict,然后将该dict传递给给定的hook。这将丢失项目的顺序
假设您使用的是3.7之前的python版本(默认情况下,dicts在3.7中是按顺序排列的),如果您检查版本的json
模块文档(例如),您将在object\u pairs\u hook
参数中找到答案:
object_pairs_hook是一个可选函数,它将通过对有序的对象列表进行解码的任何对象文本的结果来调用。将使用对象对钩子的返回值,而不是dict
。此功能可用于实现依赖于键对和值对解码顺序的自定义解码器(例如,collections.orderedict()
将记住插入顺序)。如果还定义了object_hook,则object_pairs_hook具有优先级
将
object\u hook
替换为object\u hook\u hook
,这应该满足您的要求。当您使用object\u hook
参数时,解码器将首先将映射重建为普通dict,然后将该dict传递给给定的hook。这将丢失项目的顺序
假设您使用的是3.7之前的python版本(默认情况下,dicts在3.7中是按顺序排列的),如果您检查版本的json
模块文档(例如),您将在object\u pairs\u hook
参数中找到答案:
object_pairs_hook是一个可选函数,它将通过对有序的对象列表进行解码的任何对象文本的结果来调用。将使用对象对钩子的返回值,而不是dict
。此功能可用于实现依赖于键对和值对解码顺序的自定义解码器(例如,collections.orderedict()
将记住插入顺序)。如果还定义了object_hook,则object_pairs_hook具有优先级
将
object\u hook
替换为object\u pairs\u hook
,这应该可以满足您的要求。您能告诉我需要什么输出吗?我正在json中查找结构和数组,每个数组或结构对我来说都是不同的表。所以我希望输出为:Glossary-title:example Glossary、GlossaryID:5302、GlossDiv-title:S、GlossEntry-ID:SGML、SortAs:SGML、GlossTerm:Standard Generalized Markup Language、缩写:SGML、Abbrev:iso8879:1986、GlossSee:Markup等等。但是,因为它没有维护顺序,我把它理解为:glossary,GlossDiv,GlossList,GlossEntry,GlossDef,glosssee,para:一种元标记语言,用于创建标记语言(如DocBook etccan),您能告诉我您想要什么输出吗?我在json中查找结构和数组,每个数组或结构对我来说都是不同的表。所以我希望输出为:Glossary-title:example Glossary、GlossaryID:5302、GlossDiv-title:S、GlossEntry-ID:SGML、SortAs:SGML、GlossTerm:Standard Generalized Markup Language、缩写:SGML、Abbrev:iso8879:1986、GlossSee:Markup等等。但是,因为它没有维护顺序,所以我将其命名为:glossary、GlossDiv、GlossList、GlossEntry、GlossDef、glosssee以及para:一种元标记语言,用于创建标记语言,如DocBook等