Main Content

jsonencode

基于结构化 MATLAB 数据创建 JSON 格式的文本

说明

示例

txt = jsonencode(data)data 进行编码,并返回 JSON 格式的字符向量。

txt = jsonencode(data,Name,Value) 使用一个或多个名称-值对组参数对 data 属性进行编码。

示例

全部折叠

value = {'one'; 'two'; 'three'};
jsonencode(value)
ans = 
'["one","two","three"]'

jsonencode 将不带属性的枚举编码为字符串。

on = matlab.lang.OnOffSwitchState.on;
jsonencode(on)
ans =

    '"on"'

默认情况下,jsonencode 将具有属性的枚举编码为 JSON 字符串。您可以自定义此行为。

使用 propertiesenumeration 创建在在枚举类中定义属性中所示的 SyntaxColors 类。

jsonencode 将枚举编码为 JSON 字符串。

jsonencode(SyntaxColors.Error)
ans =

    '"Error"'

添加自定义的 jsonencode 函数。该函数必须与 MATLAB® jsonencode 函数具有相同的签名。更新后的 methods 代码块是:

methods
    function c = SyntaxColors(r, g, b)  
        c.R = r; c.G = g; c.B = b;
    end
    function json = jsonencode(obj, varargin)
        s = struct('R', obj.R, 'G', obj.G, 'B', obj.B);
        json = jsonencode(s, varargin{:});
    end
end

创建一个结构体并显示调用在 SyntaxColors 中定义的 jsonencode 的编码值。

err = SyntaxColors.Error;
s = struct('Error', err);
jsonencode(s)
ans = '{"Error":{"R":1,"G":0,"B":0}}'

将包含不同数据类型的结构体转换为 JSON 格式。

s.Width = 800;
s.Height = 600;
s.Title = 'View from the 15th Floor';
s.Animated = false;
s.IDs = [116, 943, 234, 38793];
jsonencode(s,PrettyPrint=true)
ans = 
    '{
       "Width": 800,
       "Height": 600,
       "Title": "View from the 15th Floor",
       "Animated": false,
       "IDs": [
         116,
         943,
         234,
         38793
       ]
     }'

输入参数

全部折叠

MATLAB 数据,指定为任何支持的 MATLAB 数据类型。有关详细信息,请参阅局限性。有关为枚举自定义 jsonencode 的信息,请参阅自定义编码的带属性枚举

示例: s.IDs = [116, 943, 234, 38793]

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: jsonencode(-Inf,ConvertInfAndNaN=false)

自定义特殊浮点值 NaN、Inf 和 -Inf 的编码,指定为数值或逻辑值 1 (true) 或 0 (false)。true 值将浮点值编码为 nullfalse 值将浮点值编码为字面 NaNInfinity-Infinity

数据类型: logical

添加缩进,指定为 truefalse。MATLAB 显示缩进两个空格的 JSON 文本。

数据类型: logical

局限性

  • jsonencode 不支持复数数组或稀疏数组。对象必须具有编码为名称-值对组的公共属性,且对象属性上定义了 get 方法。jsonencode 不支持隐藏属性。

  • jsonencode 不支持递归结构体,例如包含对父对象和子对象的引用的图形对象。

  • 如果您对某个值进行编码,然后又进行解码,MATLAB 不能保证数据类型保持不变。JSON 支持的数据类型比 MATLAB 少,这会造成类型信息丢失。例如,JSON 数据不区分 doubleint32。如果您对某个 int32 值进行编码,然后调用 jsondecode,解码后的值的类型将为 double

  • MATLAB 不能保证数组的形状保持不变。例如,1×N 数值向量将编码为数组。如果您调用 jsondecode,则 MATLAB 会将该数组解码为 N×1 向量。

提示

  • 要保留换行符转义字符 \n,请使用 newline 函数。

    jsonencode(['one' newline 'two'])
    ans = '"one\ntwo"'
  • 要保留其他 \ 转义字符,请考虑对输入调用 sprintf。测试输入以查看 sprintf 是否创建了所需的结果。

    jsonencode(sprintf('AB\tCD'))
    ans = '"AB\tCD"'
  • 如果输入包含双引号字符 ",则该函数将插入 \ 转义字符。

    jsonencode('one"two')
    ans = '"one\"two"'

算法

JSON 支持的数据类型比 MATLAB 少。jsonencode 会将 MATLAB 数据类型转换为下表中列出的 JSON 数据类型。

MATLAB 数据类型

JSON 数据类型

示例

输出

数组,空

数组,空

jsonencode([])
jsonencode(string.empty)
'[]'

逻辑标量

布尔值

jsonencode(true)
'true'

逻辑向量

布尔值数组

jsonencode([true,false,false])
'[true,false,false]'

逻辑数组

嵌套的布尔值数组

jsonencode(logical([0,1,0;1,1,0]))
'[[false,true,false],[true,true,false]]'

字符向量

字符串

jsonencode('This is a char.')
'"This is a char."'

字符数组

字符串数组

jsonencode(['AC';'EG'])
'["AC","EG"]'

字符串标量

字符串

jsonencode("This is a string.")
'"This is a string."'

字符串向量

字符串数组

jsonencode(["AC";"EG"])
'["AC","EG"]'

字符串数组

嵌套的字符串数组

jsonencode(["AC","EG";"BD","FH"])
'[["AC","EG"],["BD","FH"]]'

空字符向量

字符串

jsonencode('')
'""'

<missing>

空值

jsonencode(string(nan))
'null'

数值标量

数值

jsonencode(2.5)
'2.5'

数值向量

数值数组

jsonencode(1:3)
'[1,2,3]'

数值数组

嵌套的数值数组

jsonencode(eye(2))
'[[1,0],[0,1]]'

复数

不支持

  

对象数组

Name = {'Jones';'Brown'};
Age = [40;49];
jsonencode(table(Name,Age))
'[{"Name":"Jones","Age":40},{"Name":"Brown","Age":49}]'

元胞标量

由 1 个元素组成的数组

jsonencode({5})
'[5]'

元胞向量

数组

jsonencode({'a',true,[2;3]})
'["a",true,[2,3]]'

元胞数组

扁平化为单一维度的数组

jsonencode({1 2;3 4})
'[1,3,2,4]'

结构体标量
对象标量

对象
对象(公共属性编码为 name-value 对组。)

jsonencode(struct('a','value'))
'{"a":"value"}'

结构体向量
对象向量

对象数组

jsonencode(struct('a',{true,true,false}))
'[{"a":true},{"a":true},{"a":false}]'

结构体数组
对象数组

嵌套的对象数组

  

日期时间标量

字符串(使用 string 方法将日期时间转换为字符串格式。)

jsonencode(datetime('tomorrow'))
'"04-Nov-2016"'

日期时间向量

字符串数组

DT = datetime({'8 April 2015','9 May 2015'}, ...
    'InputFormat','d MMMM yyyy');
jsonencode(DT)
'["08-Apr-2015","09-May-2015"]'

日期时间数组

嵌套的字符串数组

DT = datetime(...
    [{'April 2015','May 2015'};{'June 2015','July 2015'}], ...
    'InputFormat','MMMM yyyy');
jsonencode(DT)
'[["01-Apr-2015","01-May-2015"],
["01-Jun-2015","01-Jul-2015"]]'

分类标量

字符串(使用 string 方法创建字符串格式。)

jsonencode(categorical({'r'}))
'"r"'

分类向量

字符串数组

jsonencode(categorical({'r';'g';'b'}))
'["r","g","b"]'

分类数组

嵌套的字符串数组

jsonencode(categorical( ...
    {'r' 'b' 'g'; ...
    'g' 'r' 'b'; ...
    'b' 'r' 'g'}))
'[["r","b","g"],["g","r","b"],["b","r","g"]]'

containers.Map

对象

jsonencode(containers.Map( ...
    {'Jan','Feb','Mar'}, ...
    [327,368,197]))
'{"Feb":368,"Jan":327,"Mar":197}'

NaN
Inf

空值

jsonencode([1,2,NaN,3,Inf])
'[1,2,null,3,null]'

枚举

字符串

jsonencode(matlab.lang.OnOffSwitchState.on)
'"on"'

要将一个标量 MATLAB 对象作为标量 JSON 数组(括在 [] 字符中)传递,请使用元胞数组构造运算符 {} 转换该对象。例如,以下代码将 features 字段的值转换为标量 JSON 数组。

S = struct("features", struct("type", "Feature", "geometry",...
    struct("type", "point", "coordinates", [-105, 40])));
S.features = {S.features};
s = jsonencode(S)
s = '{"features":[{"type":"Feature","geometry":{"type":"point","coordinates":[-105,40]}}]}'

扩展功能

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2016b 中推出

全部展开

另请参阅

|