Python 和 Javascript 的 JSON 对接的 NaN 问题

作者: , 共 748 字 , 共阅读 0

一般而言,在 Python 里:

obj_json = json.dumps(obj)

在 Javascript 里面再:

obj = JSON.parse(obj_json);

NaN是一个特例,它在 Python 里被转为字符串"NaN",并且可以被json.loads识别。但它无法被 Javascript JSON 模块识别。在 Javascript 中,JSON.stringify(NaN)被转为"null",并且无法转回。其原因是NaN不在 json 标准内。

似乎没什么好办法,可以自己定义一个dumps

import json
import math

def dumps(obj, *args, **kwargs):
    def consistent(obj):
        if math.isnan(obj) or math.isnan(obj):
            return None

        if isinstance(obj, dict):
            for key, value in obj.items():
                obj[key] = consistent(value)
        elif isinstance(obj, list):
            for idx, value in enumerate(obj):
                obj[idx] = consistent(value)

        return obj

    return json.dumps(consistent(obj), *args, **kwargs)

Q. E. D.

类似文章:
编程 » Python库
Python 的官方自带库json库处理 JSON 很方便,但它只支持标准的 JSON 格式。rapidjson 库来自于 json 的 C++库,速度比json库快五倍,而且支持一些非标准的 JSON 字符串。
编程 » Python, numpy
今天写 Python 代码时遇到一个恶心的 bug ,花了好一会才定位和搞清楚。我的目标是寻找第一个非 NAN 的数的位置(其中 array 是一个 numpy 向量),很自然有下面实现:
编程 » C++, 数据容器, folly
folly::dynamic提供类似于C++的动态类型。和std::any可以容纳任意类型不一样,folly::dynamic只支持保存以下几种类型:
Python 数据分析工具 pandas 中以 DataFrame 和 Series 作为主要的数据结构。
编程 » javascript, vue
在写代码过程中,会定义一些变量但没有用,比如为了保持函数参数原型:
编程 » vue, javascript, eslint
最近写一个 vue 的写法:
Python的命令行包argparse内置了-h, --help命令。但它没有分组,和其它的命令混在一起,并且显示在最前面。我更喜欢把它放在单独的「LOG 和帮助」分组:
Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。
Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能:
编程 » Python, 并行计算
核心就是threading.Thread
IT » windows terminal, SSH
微软放出了 windows terminal 的正式版,它不光是 windows 自带的命令行终端,也可以用来替代 mobaterm 之类的 SSH 客户端。下面是其设置的一些笔记。