pythonjsondeconder空类型的自定义翻译

2021-04-11 15:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,jsondeconder默认情况下会将null转换为None,如下所示。如何将null->;None的翻译更改为其他内容。i、 e.空->;“Cat”

class json.JSONDecoder([encoding[, object_hook[, parse_float[, parse_int[, parse_constant[, strict[, object_pairs_hook]]]]]]])

Simple JSON decoder.

Performs the following translations in decoding by default:
  JSON  Python
  object    dict
  array     list
  string    unicode
  number (int)  int, long
  number (real)     float
  true  True
  false     False
  null  None

我想 json.loads({“field1”:空,“field2”:“data!”})在

返回 {u'field2':u'数据!',u'field1':u'Cat'}

1条回答
网友
1楼 ·

更新12/30/2014

实现这一点最简单的方法是使用object_hookJSONDecoder回调,如下面我的旧答案所述。但是,由于这需要对数据中的每个键值对进行额外的函数调用,这可能会对性能产生影响。在

因此,如果您真的想改变json如何处理None,您需要深入研究一下。JSONDecoder使用扫描仪在JSON输入中查找特定的标记。不幸的是,这是一个函数而不是一个类,因此子类化不是那么容易的。{json>可以在函数中找到/扫描仪.py。它基本上是一个函数,它获取一个jsondeconder作为参数并返回一个scan_once函数。scan_once函数接收当前扫描仪位置的字符串和索引。在

一个简单的扫描程序看起来像是一个定制的功能:

import json

def make_my_scanner(context):
    # reference to actual scanner
    interal_scanner = json.scanner.py_make_scanner(context)

    # some references for the _scan_once function below
    parse_object = context.parse_object
    parse_array = context.parse_array
    parse_string = context.parse_string
    encoding = context.encoding
    strict = context.strict
    object_hook = context.object_hook
    object_pairs_hook = context.object_pairs_hook

    # customized _scan_once
    def _scan_once(string, idx):
        try:
            nextchar = string[idx]
        except IndexError:
            raise StopIteration

        # override some parse_** calls with the correct _scan_once
        if nextchar == '"':
            return parse_string(string, idx + 1, encoding, strict)
        elif nextchar == '{':
            return parse_object((string, idx + 1), encoding, strict,
                _scan_once, object_hook, object_pairs_hook)
        elif nextchar == '[':
            return parse_array((string, idx + 1), _scan_once)
        elif nextchar == 'n' and string[idx:idx + 4] == 'null':
            return 'Cat', idx + 4

        # invoke default scanner
        return interal_scanner(string, idx)

    return _scan_once

现在我们只需要一个JSONDecoder子类,它将使用我们的扫描仪而不是默认扫描仪:

^{pr2}$

然后像这样使用它:

decoder = MyJSONDecoder()
print decoder.decode('{"field1":null, "field2": "data!"}')

旧答案,但如果您不关心另一个函数调用对性能的影响,则仍然有效:

您需要使用特殊的object_hook方法创建JSONDecoder对象:

import json

def parse_object(o):
    for key in o:
        if o[key] is None:
            o[key] = 'Cat'
    return o

decoder = json.JSONDecoder(object_hook=parse_object)

print decoder.decode('{"field1":null, "field2": "data!"}')
# that will print: {u'field2': u'data!', u'field1': u'Cat'}

根据Python documentation of the json module

object_hook is an optional function that will be called with the result of any object literal decoded (a dict). The return value of object_hook will be used instead of the dict.

所以parse_object将得到一个字典,该字典可以通过将所有None值与“Cat”交换来进行操作。然后将在输出中使用返回的对象/字典。在

相关问题