首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何阻止Json.Parse()实例化在stringified对象中找到的类?

要阻止Json.Parse()实例化在stringified对象中找到的类,可以采取以下方法:

  1. 使用reviver函数:在调用Json.Parse()时,可以传入一个reviver函数作为第二个参数。reviver函数可以对解析出的每个属性值进行处理,包括排除或替换特定的类。在reviver函数中,可以通过判断属性值的类型来决定是否实例化该类,或者将其替换为其他值。

示例代码:

代码语言:txt
复制
const jsonString = '{"name": "John", "age": 30, "address": {"street": "123 Main St", "city": "New York"}}';

const reviver = (key, value) => {
  if (typeof value === 'object' && value !== null && value.constructor.name === 'ClassName') {
    // 排除特定的类
    return undefined;
  }
  return value;
};

const parsedObject = JSON.parse(jsonString, reviver);
  1. 使用自定义的JSON解析函数:可以编写自己的JSON解析函数,遍历解析出的属性值,判断是否为特定的类,然后进行相应的处理。这种方法需要对JSON字符串进行逐字符解析,较为复杂,但可以实现更精细的控制。

示例代码:

代码语言:txt
复制
function customJsonParse(jsonString) {
  let index = 0;

  function parseValue() {
    const start = index;
    let value;

    if (jsonString[index] === '{') {
      value = parseObject();
    } else if (jsonString[index] === '[') {
      value = parseArray();
    } else if (jsonString[index] === '"') {
      value = parseString();
    } else if (jsonString.slice(index, index + 4) === 'true') {
      value = true;
      index += 4;
    } else if (jsonString.slice(index, index + 5) === 'false') {
      value = false;
      index += 5;
    } else if (jsonString.slice(index, index + 4) === 'null') {
      value = null;
      index += 4;
    } else if (jsonString[index] === '-' || (jsonString[index] >= '0' && jsonString[index] <= '9')) {
      value = parseNumber();
    } else {
      throw new SyntaxError(`Unexpected token at position ${index}`);
    }

    return value;
  }

  function parseObject() {
    const obj = {};

    index++; // 跳过左花括号

    while (jsonString[index] !== '}') {
      const key = parseString();
      index++; // 跳过冒号
      const value = parseValue();
      obj[key] = value;

      if (jsonString[index] === ',') {
        index++; // 跳过逗号
      }
    }

    index++; // 跳过右花括号
    return obj;
  }

  function parseArray() {
    const arr = [];

    index++; // 跳过左方括号

    while (jsonString[index] !== ']') {
      const value = parseValue();
      arr.push(value);

      if (jsonString[index] === ',') {
        index++; // 跳过逗号
      }
    }

    index++; // 跳过右方括号
    return arr;
  }

  function parseString() {
    let str = '';
    index++; // 跳过左引号

    while (jsonString[index] !== '"') {
      str += jsonString[index];
      index++;
    }

    index++; // 跳过右引号
    return str;
  }

  function parseNumber() {
    let numStr = '';

    while (jsonString[index] >= '0' && jsonString[index] <= '9') {
      numStr += jsonString[index];
      index++;
    }

    return parseFloat(numStr);
  }

  return parseValue();
}

const jsonString = '{"name": "John", "age": 30, "address": {"street": "123 Main St", "city": "New York"}}';

const parsedObject = customJsonParse(jsonString);

以上是两种阻止Json.Parse()实例化在stringified对象中找到的类的方法。根据具体情况选择合适的方法进行处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • python 创建, 实例, 初始以及面向对象(4.1)

    创建, 实例, 初始 什么是 就是拥有相同功能或者相同属性对象集合 创建 object是所有 class GoGamer(object): subject = 'go'...print(GoGamer) 实例 实例就是抽象概念具象 kejie = GoGamer() print(kejie) 初始 创建一个新实例时候会默认调用__init__这样一个特殊方法...init__(self, obj): self.p = obj kejie = GoGamer("金勺子") print(f"柯洁含着{kejie.p}出生") 关于self 指代还未实例实例...面向对象 面向过程 程序=数据结构+算法 强调是一个实现细节 面向对象 完成对越来越庞大项目代码以及对外公开接口归类和重用, 是一种更高级抽象....封装 把客观事物封装成抽象, 隐藏实现细节, 使得代码模块.

    1.2K10

    对象(上)、定义、访问限定符及封装、作用域 、实例对象模型 、this指针

    // C++兼容C中struct用法 // 对象 // 1个 实例 N个对象 // C++兼容C中struct用法 struct Stack { void Init(int n = 4)...class A2 { public: void f2() {} }; int main() { // -> 对象 1->多 // 对象实例 // 对象占用大小,只考虑成员变量...用类型创建对象过程,称为实例 1....一个可以实例化出多个对象实例化出对象 占用实际物理空间,存储成员变量 int main() { Person....如何计算一个大小? 答:一个对象中包含了该类所有成员变量实例(即状态),而成员函数则是通过对象引用(或指针)来调用共享代码。

    7600

    深入理解Java对象创建过程:初始实例

    实例一个对象时,JVM首先会检查相关类型是否已经加载并初始,如果没有,则JVM立即进行加载并调用构造器完成初始初始过程中或初始完毕后,根据具体情况才会去对进行实例。...关于如何使用clone方法以及浅克隆/深克隆机制,笔者已经博文《 Java String 综述(下篇)》做了详细说明。...Java对象初始过程中,主要涉及三种执行对象初始结构,分别是 实例变量初始实例代码块初始 以及 构造函数初始。  ...进一步地说,实例一个对象时,具体过程是这样:    准备实例一个对象前,首先准备实例该类,如果该类还有父,那么准备实例该类,依次递归直到递归到Object...此外,同一个加载器下,一个只会被初始一次,但是一个可以任意地实例对象

    2.5K10

    深入理解Java对象创建过程:初始实例

    实例一个对象时,JVM首先会检查相关类型是否已经加载并初始,如果没有,则JVM立即进行加载并调用构造器完成初始初始过程中或初始完毕后,根据具体情况才会去对进行实例。...Java对象初始过程中,主要涉及三种执行对象初始结构,分别是 实例变量初始实例代码块初始 以及 构造函数初始。...我们知道,Java要求实例之前,必须先实例其超,以保证所创建实例完整性。...进一步地说,实例一个对象时,具体过程是这样准备实例一个对象前,首先准备实例该类,如果该类还有父,那么准备实例该类,依次递归直到递归到Object。...此外,同一个加载器下,一个只会被初始一次,但是一个可以任意地实例对象

    3K51

    JavaScript 中 JSON 5 个小技巧🤯

    格式 默认字符串器还会缩小 JSON,看起来很难看 const user = { name: 'John', age: 30, isAdmin: true, friends: ['...= JSON.stringify(fraction); console.log(stringified); // "1/2" const revived = JSON.parse(stringified...恢复器工作是将字符串数据“恢复”回其原始形式。在这里,我们传递了一个 reviver,它是静态fromJSON属性Fraction。...在这种情况下,reviver 检查该值是否是一个有效分数,如果是,它会创建一个新Fraction对象并返回它。 有趣事实:此功能用于内置 Date 对象。...Python入门进阶:68 个 Python 内置函数详解 Java比优化Rust程序更快 看大牛是如何一次性把RPC远程过程调用,Dubbo架构进阶给讲清 Redis 源码分析 I/O 模型详解

    67420

    Java——String使用详解(实例、字符串比较、匿名对象、两种实例方法区别)

    1、String两种实例方式 String不是一个基本数据类型,它是一个,这个设计过程种加入了Java特殊支持,其实例化形式有两种形式: 直接赋值: String 对象 = “内容”; 构造方法...4、String两种实例区别 由第一节中 内容可知,对于String示例方式有两种,到底该使用哪种,两种区别是什么?...使用直接赋值实例String对象操作中,字符串内容定义后实际上会自动保存在一个对象池之中,而后,若有其他 字符串对象也采用直接赋值形式,且内容与之前完全相同,则不会开辟新堆内存空间,而是通过对象池...(str);//false 使用构造方法进行String对象实例,产生对象不会保存在对象池中,此对象无法重用。...hello").intern; //构造方法 String strb = "hello"; //直接赋值 System.out.println(str);//此处结果为true 【经典问题】:String两种对象实例区别是什么

    1.8K10

    分享 5 个使用 JSON 相关方法小技巧

    关于 JavaScriptJSON一些小技巧 1、格式 默认字符串器还会缩小 JSON,看起来很难看 const user = { name: 'John', age: 30,...isAdmin":true,"friends":["Bob","Jane"],"address":{"city":"New York","country":"USA"}} JSON.stringify也有一个内置格式程序...= JSON.stringify(fraction); console.log(stringified); // "1/2" const revived = JSON.parse(stringified...恢复器工作是将字符串数据“恢复”回其原始形式。在这里,我们传递了一个 reviver,它是静态fromJSON属性Fraction。...在这种情况下,reviver 检查该值是否是一个有效分数,如果是,它会创建一个新Fraction对象并返回它。 有趣事实:此功能用于内置 Date 对象

    55920

    你不知道JavaScript中5个JSON秘密功能

    作者: Siddharth 译者:前端小智 来源:dev 开发中,我们会经常使用 JSON.stringify(object) 来序列对象,但JSON.stringify方法除了了第一个参数外,还有其它参数可用...序列数据中隐藏某些属性 JSON.stringify 还有一个很少有人知道第二个参,称为 replacer,是一个函数或数组,决定哪些数据要保留在输出中,哪些不要。...= JSON.stringify(fraction); console.log(stringified); // "1/2" const revived = JSON.parse(stringified...reviver 工作是将字符串数据 "恢复"到它原始形式。在这里,我们传递了一个reviver,它是 Fraction 静态方法 fromJSON。...有趣是:这个功能在内置Date对象中使用。

    31020

    【C++】构造函数分类 ② ( 不同内存中创建实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

    一、不同内存中创建实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...栈内存中 变量 Student s1 ; 这些都是 栈内存 中创建 实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存中实例对象销毁 ; 栈内存中 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 栈内存 中声明 实例对象 方式是 : 该 s1...实例对象存放在栈内存中 , 会占用很大块栈内存空间 ; Student s1; 堆内存 中声明 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中 , 栈内存中只占 4 字节指针变量大小...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass , 该类定义了一个有参构造函数

    16520

    Python直接改变实例对象列表属性值 导致flask中接口多次请求报错

    错误原理实例如下: class One(): list = [1, 2, 3] @classmethod def get_copy_list(cls): # copy...# 直接返回此对象list,任何对list操作都会影响到此对象list return cls.list if __name__ == '__main__': # 不影响到...中,知识点:一个请求 进入到进程后,会从进程 App中生成一个新app(在线程中应用上下文,改变其值会改变进程中App相关值,也就是进程App指针引用,包括g,),以及生成一个新请求上下文(...错误接口代码大致如下: class 响应如下(每次请求,都会向model列表属性值添加元素,这样会随着时间增长导致内存消耗越来越大,最终导致服务崩溃): ?...总结:刚开始以为 一次请求过程中,无论怎么操作都不会影响到其他请求执行,当时只考虑了 请求上下文中不会出现这种问题,但是 应用上下文,是 进程App相关属性或常量一个引用(相当于指针),任何对应用上下文中改变

    5K20
    领券