# JSON

# 静态方法

# parse

JSON.parse() 方法用来解析 JSON 字符串,构造由字符串描述的对象。可能返回值是: UTSJSONObject/Array/number/boolean/string 等基本数据类型

特别说明: HBuilderX3.9.0统一为以上规范,在HBuilderX3.9.0之前版本 返回值只可能是 UTSJSONObject, 基本数据类型会转换失败 JSON.parse 目前仅支持第一个参数

      const json = `{"result":true, "count":42}`;
      const obj = JSON.parse(json) as UTSJSONObject;
      console.log(obj["count"]);
      // expected output: 42

      console.log(obj["result"]);
      // expected output: true

注意

  • JSON.parse 解析出来的对象,目前仅支持使用方括号[]访问
  • 如果输入的字符串不是合法的json格式,则会返回 null
  • JSON.parse 接口内部通过特殊方式读取了范型类型,不支持传入动态的范型:比如将外层方法的普通范型参数传入 JSON.parse。

# parse(text, reviver?)

JSON.parse() 方法用来解析 JSON 字符串,构造由字符串描述的 JavaScript 值或对象。提供可选的 reviver 函数用以在返回之前对所得到的对象执行变换 (操作)。

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串
reviver (this: any, key: string, value: any) => any - - [可选]转换器,如果传入该参数 (函数),可以用来修改解析生成的原始值,调用时机在 parse 函数返回之前。

返回值

类型 描述
any | null 返回一个any 或者 null
      const json = `{"result":true, "count":42}`;
      const obj = JSON.parse(json) as UTSJSONObject;
      console.log(obj["count"]);
      // expected output: 42

      console.log(obj["result"]);
      // expected output: true

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 - - - -

# parse<T>(text: string)

JSON.parse() 方法用来解析 JSON 字符串,构造由字符串描述的值或者对象,其类型由泛型参数T决定
如果输入的是一个合法的json值或者对象,返回一个对应的T值或者对象,如果json描述的值或对象和 T 指定的类型不符,将返回null

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串

返回值

类型 描述
T | null 返回一个T类型的值或者对象 或者 null
      const json2 = '{"string":"Hello","number":42,"boolean":true,"nullValue":null,"array":[1,2,3],"object":{"nestedKey":"nestedValue"}}';
      const obj2 = JSON.parse<UTSJSONObject>(json2)!;

HBuilderX 3.9+,支持JSON.parse传入泛型

与不带泛型的JSON.parse 相比,多了一个<Persion> 尖括号 用来指定返回类型。

相比不带泛型的parse函数,带泛型的 parse函数,会提高反序列数据的开发效率,明确的结构数据可以提升工程健壮度

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x 3.9 x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 3.90 - - - -

# stringify(value, replacer?, space?)

注意:JSON.stringify 目前仅支持第一个参数

JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性

参数

名称 类型 必填 默认值 兼容性 描述
value any | null - - 将要序列化成 一个 JSON 字符串的值。
replacer any | null -
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。 仅Android/web HBuilder X 4.25之后支持
space any | null -
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为 10。该值若小于 1,则意味着没有空格;如果该参数为字符串(当字符串长度超过 10 个字母,取其前 10 个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。 仅Android/web HBuilder X 4.25之后支持

返回值

类型
string
      console.log(JSON.stringify({ x: 5, y: 6 }));
      // expected output: "{"x":5,"y":6}"

      console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
      // expected output: ""2006-01-02T15:04:05.000Z""

序列化规则说明:

类型名称 适应范围 规则
基本类型 number/string/boolean 对应json格式中的 原型数据类型
容器数据类型 UTSArray/UTSJSONObject 对应json格式中的 jsonarray/jsonobject
map和set map和set 与web保持一致,序列化为 空jsonobject对象: {}
自定义type 开发者使用type 声明的类型对象 被序列化为 jsonobject
自定义class 开发者使用class 声明的类型对象 被序列化为 空jsonobject对象: {}
function 对象内部声明的函数 被序列化为 null

# parseObject(text: string)

注意: 此函数需要 HBuilderX 3.9x 以上版本

JSON.parseObject() 方法用来解析 JSON 字符串,构造由字符串描述的对象。
如果输入的是一个合法的json对象,返回一个对应的UTSJSONObject,如果是json array 或者其他格式的字符串返回null

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串

返回值

类型 描述
UTSJSONObject | null 返回一个UTSJSONObjet 或者 null
      const json = `{"result":true, "count":42}`;
      const obj = JSON.parseObject(json);
      console.log(obj?.["count"])//42

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 3.90 - - - -

# parseObject<T>(text: string)

注意: 此函数需要 HBuilderX 3.9x 以上版本

JSON.parseObject() 方法用来解析 JSON 字符串,构造由字符串描述的对象,该对象的类型由泛型参数T决定
如果输入的是一个合法的json对象,返回一个对应的T对象,如果是json array 或者其他格式的字符串返回null

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串

返回值

类型 描述
T | null 返回一个T类型对象 或者 null
      const json1 = `{
			    "name": "John",
			    "id": "30"
			  }`;
      let obj2 = JSON.parseObject<UserJSON>(json1);
      console.log(obj2!.id) //30

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x 3.9 x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 3.90 - - - -

# parseArray(text: string)

注意: 此函数需要 HBuilderX 3.9x 以上版本

JSON.parseArray() 方法用来解析 JSON 字符串,构造由字符串描述的数组。数组元素类型为any
如果输入的是一个合法的json数组,返回一个对应的Array,如果是json object 或者其他格式的字符串返回null

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串

返回值

类型 描述
Array<any> | null 返回一个Array 或者 null
      const json1 = `[1,2,3]`;
      const array1 = JSON.parseArray(json1);
      console.log(array1)//[1, 2, 3]

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 3.90 - - - -

# parseArray<T>(text: string)

注意: 此函数需要 HBuilderX 3.9x 以上版本

JSON.parseArray() 方法用来解析 JSON 字符串,构造由字符串描述的数组。数组元素类型由泛型T决定
如果输入的是一个合法的json数组,返回一个对应的Array,如果是json object 或者其他格式的字符串返回null

参数

名称 类型 必填 默认值 兼容性 描述
text string - - 要被解析成 JavaScript 值的字符串

返回值

类型 描述
Array<T> | null 返回一个Array 或者 null
      const json3 = `[{"name":"John","id":"30"},{"name":"jack","id":"21"}]`;
      const array3 = JSON.parseArray<UTSJSONObject>(json3);
      console.log((array3![0])["name"])//"John"

兼容性

Web uni-app x Android uni-app x iOS uni-app x Android uni-app iOS uni-app Web uni-app
4.0 3.90 4.11 x x

UTS 插件兼容性

Android uni-app x UTS 插件 Android uni-app UTS 插件 iOS uni-app x UTS 插件 iOS uni-app UTS 插件 Harmony uni-app x UTS 插件 Harmony uni-app UTS 插件
3.90 3.90 - - - -

# 参见

相关 Bug

# 兼容性说明

从 HBuilder X 4.21 版本开始,JSON.parse 未指定类型泛型的情况下解析得到的 number 类型,不再是 kotlin.Number 而是 UTSNumber 类型。

对开发者影响在于:之前允许 number 类型使用 as 操作符进行数据类型转换,在4.21 之后版本,此行为会导致编译报错.

let jsonObject = JSON.parseObject('{"a":1}') ;
let b:Int = jsonObject!['a'] as Int
console.log(b)

上面这段代码,在HBuilder X 4.21之前版本是可以运行的,但是在 HBuilder X 4.21 之后版本会在编译阶段触发下面的报错:

‌error: java.lang.ClassCastException: io.dcloud.uts.UTSNumber cannot be cast to java.lang.Integer‌

如果需要数据类型转换,请使用 toXXX 替代,上面的代码可以替换为:

let jsonObject = JSON.parseObject('{"a":1}') ;
let b:Int = (jsonObject!['a'] as Number).toInt()
console.log(b)