Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python json.loads对象_hook=OrderedDict不工作_Python_Json - Fatal编程技术网

Python json.loads对象_hook=OrderedDict不工作

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

我有以下json文件:

{
  "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等