我去!竟然还能这样高效地操作 JSON 对象!

公众号:程序员白特,欢迎一起交流学习~

什么是 JSON Pointer

JSON Pointer是一种简单而强大的方法,用于定位 JSON(JavaScript Object Notation)文档中特定值。它通过使用斜杠 / 分隔符来指示 JSON 对象的层级结构,以确切地标识所需值的位置。

我们为什么要使用 JSON Pointer

处理大型或复杂的 JSON 数据结构时,要定位特定的值可能会变得非常困难。使用 JSON Pointer 可以简单而准确地指定所需值的位置,而无需编写复杂的代码来遍历整个 JSON 结构。这大大简化了 JSON 数据的定位和操作过程。

另外,JSON Pointer 还有以下优势:

  • 通用性:JSON Pointer 是一种通用的标准,因此可以在各种编程语言和平台上使用。这种通用性使得 JSON Pointer 成为跨平台开发和数据交换的理想选择。
  • 效率:由于 JSON Pointer 可以直接定位到所需值,因此它在处理大型 JSON 数据时效率很高。相比于传统的逐层遍历搜索方式,JSON Pointer 能够更快速地找到目标值。
  • 简单易懂:JSON Pointer 使用类似文件路径的语法,因此非常直观和易于理解。它的语法简洁清晰,使得使用者可以轻松地理解和使用它。
  • 精确定位:JSON Pointer 允许你以非常准确的方式指定 JSON 对象中的值,而无需关心其周围的结构。这意味着你可以专注于所需值的确切位置,而不必担心其他内容。

使用 JSON Pointer 的方法

许多常见的开发语言都实现了 JSON Pointer 规范。在 Node.js 环境中,我们可以使用 jsonpointer这个库。

首先,使用 npm 或 pnpm 安装 jsonpointer

npm install jsonpointer  
or  
pnpm add jsonpointer  

安装成功后,我们就可以利用 jsonpointer 库提供的 API 快速定位和操作 JSON 对象。

1. 获取指定路径的属性值

使用 JSON Pointer,可以通过斜杠 / 分隔符来指定 JSON 对象的层级结构,并获取指定路径下的属性值。如果指定的路径不存在,将返回 undefined

const jsonpointer = require("jsonpointer");  
let obj = {  
  foo: 1,  
  bar: { baz: 2 },  
  qux: [3, 4, 5],  
  zoo: {  
    e: [{ a: 3 }, { b: 4 }, { c: 5 }],  
  },  
};  
  
jsonpointer.get(obj, "/foo"); // returns 1  
jsonpointer.get(obj, "/bar/baz"); // returns 2  
  
jsonpointer.get(obj, "/quo"); // returns undefined  

2.获取数组对象指定位置的值

要获取数组对象指定位置的值,需要在索引后面添加 / 分隔符。

jsonpointer.get(obj, "/qux/0"); // returns 3  
jsonpointer.get(obj, "/qux/1"); // returns 4  
jsonpointer.get(obj, "/qux/2"); // returns 5  

如果数组元素也是对象的话,我们只需按照属性的层级结构进行访问路径即可。

jsonpointer.get(obj, "/zoo/e/0/a"); // returns 3  
jsonpointer.get(obj, "/zoo/e/1/b"); // returns 4  
jsonpointer.get(obj, "/zoo/e/2/c"); // returns 5  

除了可以获取 JSON 对象的值外,我们还可以通过使用 jsonpointer 库提供的 set 方法来设置特定路径的值。

3.设置指定路径的属性值

JSON Pointer 提供了一种方便的语法,用于向数组中插入新元素,即在 / 路径后添加 - 符号。

// sets obj.foo = 6;  
jsonpointer.set(obj, "/foo", 6);   
// sets obj.qux = [3, 4, 5, 6]  
jsonpointer.set(obj, "/qux/-", 6);   
  
// set zoo.e = [{"a":3},{"b":4},{"c":5},{"d":6}]  
jsonpointer.set(obj, "/zoo/e/-", { d: 6 });   

除了前面提到的 setget 方法,jsonpointer 这个库还有一个 compile 方法,它可以返回一个新的 JSON Pointer 对象,使我们更便捷地访问 JSON 对象中指定路径的属性。

const pointer = jsonpointer.compile("/foo");  
pointer.get(obj); // returns 6  
pointer.set(obj, 1); // sets obj.foo = 1  

JSON Pointer 在 LangchainJS 中的应用

在LangchainJS的JSONLoader中,还使用了jsonpointer库。使用该库的主要目的是迅速提取用户所需的数据。

使用示例

example.json

{  
  "1": {  
    "body": "BD 2023 SUMMER",  
    "from": "LinkedIn Job",  
    "labels": ["IMPORTANT", "CATEGORY_UPDATES", "INBOX"]  
  },  
  "2": {  
    "body": "Intern, Treasury and other roles are available",  
    "from": "LinkedIn Job2",  
    "labels": ["IMPORTANT"],  
    "other": {  
      "name": "plop",  
      "surname": "bob"  
    }  
  }  
}  

JSONLoader

export declare class JSONLoader extends TextLoader {  
    pointers: string[];  
    constructor(filePathOrBlob: string | Blob, pointers?: string | string[]);  
}  

假设我们只想要提取 fromsurname 的信息:

import { JSONLoader } from "langchain/document_loaders/fs/json";  
  
const loader = new JSONLoader(  
  "src/document_loaders/example_data/example.json",  
  ["/from", "/surname"]  
);  
  
const docs = await loader.load();  

通过将 pointers 参数设置为 ["/from", "/surname"],我们可以轻松提取所需的 JSON 对象数据。

[  
  Document {  
    pageContent: 'LinkedIn Job',  
    metadata: { source: './src/json/example.json', line: 1 }  
  },  
  Document {  
    pageContent: 'LinkedIn Job2',  
    metadata: { source: './src/json/example.json', line: 2 }  
  },  
  Document {  
    pageContent: 'bob',  
    metadata: { source: './src/json/example.json', line: 3 }  
  }  
]  
#前端##我的实习求职记录##实习,投递多份简历没人回复怎么办##我的求职思考##如何判断面试是否凉了#
全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务