javascript - 检查对象在 JavaScript 中是否可序列化的可靠方法

标签 javascript json serialization

是否有已知的方法或库已经有帮助程序来评估一个对象在 JavaScript 中是否可序列化?

我尝试了以下方法,但它没有涵盖原型(prototype)属性,因此它提供了误报:

_.isEqual(obj, JSON.parse(JSON.stringify(obj))

还有另一个 lodash 函数可能会让我更接近真相,_.isPlainObject。然而,当 _.isPlainObject(new MyClass()) 返回 false 时,_.isPlainObject({x: new MyClass()}) 返回true,因此需要递归应用。

在我自己冒险之前,有没有人知道一种已经可靠的方法来检查 JSON.parse(JSON.stringify(obj)) 是否会实际产生与 相同的对象对象?

最佳答案

function isSerializable(obj) {
  var isNestedSerializable;
  function isPlain(val) {
    return (typeof val === 'undefined' || typeof val === 'string' || typeof val === 'boolean' || typeof val === 'number' || Array.isArray(val) || _.isPlainObject(val));
  }
  if (!isPlain(obj)) {
    return false;
  }
  for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
      if (!isPlain(obj[property])) {
        return false;
      }
      if (typeof obj[property] == "object") {
        isNestedSerializable = isSerializable(obj[property]);
        if (!isNestedSerializable) {
          return false;
        }
      }
    }
  }
  return true;
}

递归迭代所有给定的对象属性。它们可以是:

  • 普通对象(“由 Object 构造函数创建的对象或 [[Prototype]] 为 null 的对象。”- 来自 lodash 文档)
  • 数组
  • 字符串数字 bool 值
  • 未定义

传递的 obj 中的任何其他值都会导致它被理解为“不可序列化”。

(老实说,我不是绝对肯定我没有忽略对某些可序列化/不可序列化数据类型的检查,实际上我认为这取决于“可序列化”的定义 - 欢迎任何意见和建议.)

关于javascript - 检查对象在 JavaScript 中是否可序列化的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579940/

相关文章:

JavaScript Json 值基于 equals 条件附加

java - 从字符串反序列化 Java 二叉树

java自定义ObjectOutputStream为特定类的每个实例写入附加数据

使用 JPA 和 Rest API 进行 Java 序列化

json - 如何在客户端生成JSON

android - 如何将 JSON 数据作为参数从 Android 发送到 Jersey RESTful 服务

javascript - 使用 css 动态切割多边形 - 跨浏览器

javascript - 缩小的 css 和 js 文件没有使用 minify-maven-plugin 复制到最终的 war 文件

javascript - 为父对象创建动态对象并分配键和值?

php - 带有 json 响应的 jQuery ajax 表单