首页 > 其他分享 >JSON.stringify()的几个场景

JSON.stringify()的几个场景

时间:2023-04-13 19:34:13浏览次数:29  
标签:stringify 场景 const value JSON result obj

循环引用

使用JSON.stringify()时,遇到循环引用的时候,会抛出错误TypeError: Converting circular structure to JSON,如果需要强行转成字符串的话,需要利用到该方法的第二个参数。

主要思路其实就是将循环引用的部分替换成某个标识,等到解析的时候去替换掉,就可以拿到原来的循环引用的对象。通常是为了在输出json文件后,依然可以得到原来的循环引用的对象来处理。在此也就是抛砖引玉,不做更多的探讨,下面的实现肯定有遗漏的地方,主要就是记录一下思路。

// 先讲环的部分按照自己的格式存起来,并且记录环指向的对象
const JSONStringify = (obj) => {
  const cache = new Map();
  // 额外套一层,就是为了防止循环引用的是最外层的对象,无法去记录对应的key值
  const newObj = {
    entry: obj
  };
  return JSON.stringify(newObj, (key, value) => {
    if(typeof value === 'object' && value !== null) {
      if(cache.has(value)) {
        return `[[object_${cache.get(value)}]]`;
      }
      cache.set(value, key);
    }
    return value;
  })
};

// 用来专门解析上面产生的字符串
const JSONParse = (objStr) => {
  const parseObj = JSON.parse(objStr);

  let cache = {};
  const ergodic = (obj) => {
    for(const [key, value] of Object.entries(obj)) {
      // 匹配到了环的部分就去替换
      if(/\[\[object_\w+\]\]/.test(value)) {
        const [,circleKey] = value.slice(2, -2).split('_');
        obj[key] = cache[circleKey];
      }
      // 记录所有的对象
      if(typeof value === 'object' && value !== null) {
        cache[key] = value;
        ergodic(value);
      }
    }
  };

  ergodic(parseObj);

  return parseObj.entry;
};

const obj = {
  a: {
    b: 1
  }
};

obj.a.c = obj;

const objStr = JSONStringify(obj); 
// {"entry":{"a":{"b":1,"c":"[[Object_entry]]"}}}
const newObj = JSONParse(objStr);
// { a: { b: 1, c: [Circular *1] } }

大JSON的处理

当 JSON.stringify 所生成的字符串长度超过了一定大小的限制后,会抛出Uncaught RangeError: Invalid string length错误。

我自己的思路大概有两个,一个是拆开去转化,另一个就是使用数据流的形式去读写,目前用第一种方式也能满足我的场景。正常来说,拆开就可以防止一次的JSON.stringify占据的内存过大,如果拆开一层还不行,可以试试递归几次应该就满足了。

const bigJSONStringify = (obj) => {
  let result = '';
  if(Array.isArray(obj)) {
    result += '[';
    for(let value of obj) {
      if(typeof value === 'object' && value !== null) {
        result += JSON.stringify(value);
      } else {
        result += value;
      }
      result += ','
    }
    result = result.slice(0, -1) + ']';
  } else {
    result += '{';
    for(const [key, value] of Object.entries(obj)) {
      if(typeof value === 'object' && value !== null) {
        result += `"${key}": ${JSON.stringify(value)}`;
      } else {
        // 字符串类型加双引号
        result += `"${key}": ${typeof value === 'string' ? `"${value}"` : value}`;
      }
      result += ','
    }
    result = result.slice(0, -1) + '}';
  }
  return result;
};
bigJSONStringify([{ a: 'a', v:2, d: { m: 3}}, 2, { c: 1, d: 3 }])
// [{"a":"a","v":2,"d":{"m":3}},2,{"c":1,"d":3}]
bigJSONStringify({ a: 'a', v:2, d: { m: 3}})
// {"a": "a","v": 2,"d": {"m":3}}

格式化写入到文件中的json

经常发现写入到文件中的json是挤在一起的,就想着有没有可能在写入的时候就格式化一下,发现JSON.stringify是提供了的,就是第三个参数,为数字的话,就是缩进的格数,为字符串的话,就是用这个字符串替代缩进,不过都有一个最大值的限制,数字不能大于10,字符串超过10的长度就取前10个字符。

fs.writeFileSync('./test.json', JSON.stringify({ a: 1, b: 2, c: 3 }, null, 4), 'utf-8');
//{
//    "a": 1,
//    "b": 2,
//    "c": 3
//}
fs.writeFileSync('./test.json', JSON.stringify({ a: 1, b: 2, c: 3 }, null, '----'), 'utf-8');
//{
//----"a": 1,
//----"b": 2,
//----"c": 3
//}

标签:stringify,场景,const,value,JSON,result,obj
From: https://www.cnblogs.com/aloneMing/p/17316102.html

相关文章

  • json
    1、介绍JSON:JavaScriptObjectNotation(JavaScript对象表示法)JSON是存储和交换文本信息的语法,类似XML。JSON比XML更小、更快,更易解析。JSON易于人阅读和编写。2、数据类型(1)数字(整数或浮点数)(2)字符串(在双引号中)(3)逻辑值(true或false)(4)数组由[]包围,其内......
  • 两阶段鲁棒优化模型 多场景 采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列
    两阶段鲁棒优化模型多场景采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列与约束生成(CCG)算法进行求解,场景分布的概率置信区间由1-范数和∞-范数约束,程序含拉丁超立方抽样+kmeans数据处理程序,程序运行可靠,有详细资料YID:69120677501311622......
  • adobe安装提示错误“Error:SyntaxError:JSON Parse error:Unexpected EOF”的解决方法
    mac电脑安装Adobe时,会提示错误“Error:SyntaxError:JSONParseerror:UnexpectedEOF”,这是怎么回事儿的,不管您是安装AI、ps、PR还是lr,如果也遇到相同的问题,可以参考一下方法解决。adobe安装提示错误“Error:SyntaxError:JSONParseerror:UnexpectedEOF”的解决方法,如下:需要使用A......
  • C# Json序列化,设置驼峰命名(字段首字母小写)
    相关代码:varserializerSettings=newJsonSerializerSettings{//设置为驼峰命名ContractResolver=newCamelCasePropertyNamesContractResolver()};varresult=JsonConvert.Ser......
  • 七天玩转Redis | 打卡第三天 使用Redis的地理位置、基数统计、位图场景
    今天学习的内容今天学习了Redis在地理位置、基数统计、位图场景上的使用今天的收获今天的收获,了解了Redis在另外几个场景下的应用,比如说地理位置长的应用,在以前我只知道用一些特殊的api来计算距离,没想到Redis还提供这样的服务,这样可以省去调用一些api来计算,可以直接将要计......
  • JAVA返回前端时候bean转json时首字母、第二个字母大写会自动变成小写的问题
      后台bean是privateStringuName;但是前端生成的json是uname会自动变成小写 如果我们只是个别的几个的话,只需要加个注解@JsonProperty("uName")privateStringuName; 这样就可以了......
  • mvc响应-返回json数据
         ......
  • 分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?
    所有的资源管理系统都需要解决资源的有效利用、任务的有效响应、调度策略的灵活配置这三个最基本问题。那么在分布式的场景下,YARN和Kubernetes是怎么解决的呢?本篇进行介绍。  — ApacheYARN —YARN全称为(YetAnotherResourceNegotiator),是一个集群共享的调度框架,有良好......
  • LVS/Nginx/HAProxy原理及应用场景介绍
    负载均衡已经发展成为网络架构中的基础核心组件,消除了服务器单点故障,可以进行请求流量分流,提升冗余,保证服务器的稳定性。在开源的软件负载均衡中,应用最为广泛的有LVS、Nginx、HAProxy,甚至阿里云的SLB也是基于LVS及Nginx的。本文就来阐述下LVS、Nginx、HAProxy的工作原理及应用场景......
  • JavaScript 数组字符串转换Json格式
    JavaScript数组字符串转换Json格式//滔Roy2023.04.13functionparseStringToArray(str){//尝试将字符串解析为JSON格式try{constarr=JSON.parse(str);//如果解析成功,则直接返回解析结果if(Array.isArray(arr)){returnarr;}}......