图片缩略图

JSONLab:用于编码/解码JSON文件的工具箱

版本2.0.1 (137 KB) 千千方
在MATLAB/Octave中编码/解码JSON/UBJSON/MessagePack文件的工具箱

182下载

更新14 june 2020

查看版本历史

查看许可协议

编者按:受欢迎的文件2018

此文件被选为MATLAB Central本周精选

** JSONLab 2.0 Final (Magnus Prime)于2020年6月14日发布
==============================================================
发布网址:https://github.com/fangq/jsonlab/releases/tag/v2.0
取决于://www.tatmou.com/matlabcentral/fileexchange/71434-zmat
数据格式根据
- JData规范草案-3:http://github.com/OpenJData/jdata,
-二进制JData规范草案-1http://github.com/OpenJData/bjdata
Python模块读取/写入JSONLab文件:
- jdata:https://pypi.org/project/jdata/
- bjdata:https://pypi.org/project/bjdata/
==============================================================

JSONLab是一个免费和开源的JSON/UBJSON/MessagePack编码器
用MATLAB语言编写的解码器。它可以用来转换MATLAB
数据结构(数组、结构体、单元格、结构体数组、单元格数组和对象)的转换
JSON/UBJSON/MessagePack格式的字符串和文件,或解析
JSON/UBJSON/MessagePack文件转换成MATLAB数据结构。JSONLab两金宝app者都支持
MATLAB及GNU Octave [http://www.gnu.org/software/octave](一个免费的MATLAB克隆)。

JSON (JavaScript对象符号,http://www.json.org/)是高度便携的,
人类可读和“无脂肪”的文本格式表示复杂和层次
数据,广泛用于应用程序中的数据交换。UBJSON(通用二进制JSON,
http://ubjson.org/)是一种二进制JSON格式,专门用于处理
JSON的局限性,允许有效存储强类型的二进制数据
数据记录,导致文件大小更小,编码和解码速度更快。
MessagePack是另一种在数据中广泛使用的类似json的二进制数据格式
交换web/本地应用程序。它比UBJSON更紧凑,
但与UBJSON相比,它不能直接读取。

我们设想JSON和它的二进制对等体都将发挥重要作用
规则不仅适用于轻量级数据存储,而且适用于存储和交换
科学数据。它具有其他通用用途的灵活性和通用性
文件规格,例如HDF5 [http://www.hdfgroup.org/HDF5/whatishdf5.html
但显著降低了复杂性和出色的可读性。

为了实现这个目标,我们开发了JData规范(http://github.com/fangq/jdata
标准化复杂科学数据结构的序列化,例如
N-D数组,稀疏/复值数组,树,映射,表和图形使用
JSON/二进制JSON构造。文本和二进制格式的JData文件是
在语法上与JSON/UBJSON格式兼容,并且可以很容易地解析
使用现有的JSON和UBJSON解析器。JSONLab不仅仅是一个解析器和编写器
的JSON/UBJSON数据文件,但系统地转换复杂的科学
数据结构转换为人类可读且普遍支持的JSON表单金宝app
标准化的JData数据注释。

请在以下网址找到详细的联机帮助http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab/Doc

==最新消息==

JSONLab v2.0——代码名为“Magnus Prime”——是JSONLab和JSONLab的稳定版本
一个迈向稳定、完整的参考实现的新里程碑
JData规范(http://openjdata.org)用于便携式科学数据存储。

自上一个版本以来,此版本添加了许多主要更新
2019年10月发布v1.9.8。下面总结了主要变化的列表
(带有*标记的关键特性),包括对' _ArrayShape_ '的支持金宝app
高效编码特殊矩阵,并添加' jsave/jload '保存
并在MATLAB/Octave中恢复变量,如“保存/加载”命令(实验性)。

= = = jsave。m = = =

将当前工作空间保存到jamdata.jamm
jsave mydata.jamm
jsave(“mydata.jamm”、“var”{‘var1’,‘var2})
jsave(“mydata.jamm”、“压缩”、“lzma”)

= = = jload。m = = =

从jamdata加载变量。阻塞到当前工作空间
jload mydata。负载变量
var = jload(“mydata.jamm”、“var”{‘var1’,‘var2})

==其他更新

*更改jload和jsave的默认工作空间为caller
*创建' jdata '和' bjdata ' python模块与MATLAB共享数据
*增加savebj和loadbj,专门用于加载和保存bjdata
*添加单元测试脚本,修复测试单元中发现的问题
*加速fast_match_括号,下降unicode2native速度
*金宝app支持Toeplitz矩阵,使用不区分大小写的比较
*jdatadecode现在处理_ArrayOrder_
*在jsave和saveubjson中添加keeptype选项
*使jsave和jload工作在八度
*应用数据压缩字符串,新的数据类型char
*修复loadmsgpack ND数组问题
*添加jsave和jload用于便携式数据共享
*增加了对_Ar金宝apprayShape_记录特殊矩阵的支持
*jsonlab与matlab R2008兼容
*saveubjson现在实现BJData规范Draft1,https://github.com/fangq/bjdata
*添加UseMap选项,以避免键名转换
*减少jsonopt调用,以加快编码和解码
*在savejson和saveubjson中启用jdataencode

引用作为

方倩倩(2021)。JSONLab:用于编码/解码JSON文件的工具箱(//www.tatmou.com/matlabcentral/fileexchange/33381-jsonlab-a-toolbox-to-encode-decode-json-files), MATLAB中央文件交换。检索

意见及评分(228

KAE

帕维尔

谢谢,这是很棒的工具。
不过,我在路径名称方面有一个小问题。每当路径包含斜杠字符'/'时,它就会在Json中被特殊字符'\/'取代。
例如,字符串'/myfolder/myfile'将变成'\/myfolder\/myfile'
这破坏了我与其他工具的兼容性。我无法找到如何迫使savejson不包括在每个“/”之前的“\”,我还没有成功。

你能告诉我怎么做吗?

谢谢你!

千千方

上面的编辑选择链接提供了一个很好的入门示例:
https://blogs.mathworks.com/pick/2015/04/24/parsing-json-files/

你也可以运行“help loadjson”来查看额外的输入格式。

汉克梁

对不起,我没有把问题说得更具体。我的问题是我有一个Matlab 2017,它有Jsondecode功能,我也在Matlab的路径中添加了你的JsonLab,但我不知道如何(哪种脚本行)读取文件夹中的json文件。我知道在Json文件中应该是什么样子,如你的例子所示https://github.com/fangq/jsonlab/tree/master/examples
你能不能用matlab写一行,这样我就可以打开我的xxx。json文件吗?我是说哪个命令?对不起,这可能是一个天真的问题,但我只是不知道如何使用您的jsonlab编写命令。我已经尝试了其他方法,如fname = 'meta_Electronics.json';
Val = jsondecode(fileread(fname))//www.tatmou.com/matlabcentral/answers/326764-how-can-i-read-a-json-file.它没有工作,这就是为什么我想试试你的Jsonlab。再次感谢!

千千方

@Hank,内置示例在示例文件夹中提供:https://github.com/fangq/jsonlab/tree/master/examples,请打开几个演示脚本并查看基本语法。如果您的文件无法加载,请先将内容粘贴到https://jsonlint.com/并验证它是一个有效的JSON文件-如果是并且loadjson加载失败,请在https://github.com/fangq/jsonlab/issues

汉克梁

嗨,我有医学背景。但是你能给我展示一个如何使用JsonLab的简单例子吗?我只是不能打开/读取一个文件,如:record_hear.json
先谢谢你。

DongKi敏

泰勒

大卫Chlemdorff

@千千方,是的,我注意到了。很抱歉,Mathworks不允许我删除“review”

千千方

如果您在过去一周下载了v1.9.8,请重新下载。
使用UBJSON/MessagePack格式保存数字“256”时发现并修复了一个错误,以下是修复方法

https://github.com/fangq/jsonlab/commit/f2bfb653be8349dd8acae845b7b4c0218abdb7ab

千千方

我很高兴地告诉您,现在可以下载一个新版本JSONLab v1.9.8。这是过去8年JSONLab开发中最重要的更新之一——JSONLab不仅是一个原生JSON/二进制JSON编码器/解码器库,而且是JData规范的官方参考实现(http://github.com/fangq/jdata) -一种数据格式开放标准,允许研究人员使用JSON和二进制JSON存储各种科学数据,以获得最大的可移植性、可读性和未来扩展。JData规范也是OpenJData项目(http://openjdata.org).

在这个新版本中,JSONLab获得了许多更新,包括

1)对Mess金宝appagePack的新支持(http://msgpack.org),一个紧凑的类似json的二进制格式,
2) jdataencode/jdatadecode函数来定义JData规范,并与其他数据格式(如HDF5)一起使用。
3)一个完全重写的快速数组ND解析器;
4)几种新的数据压缩方法,包括lzma, lzip, lz4, lz4hc(必须安装ZMat工具箱://www.tatmou.com/matlabcentral/fileexchange/71434-zmat
5)支金宝app持导入/导出*任意* matlab对象/类使用无文档的数据序列化接口
6)支金宝app持表、图、有向图、枚举、分类等多种数据格式

详细的更改日志可以在https://github.com/fangq/jsonlab/releases/tag/v1.9.8

与2019年5月发布的JSONLab v1.9相比,有两个主要变化可能导致文件不兼容:

* _ArrayCompressionMethod_, _ArrayCompressionSize_和_ArrayCompressedData_分别被_ArrayZipType_, _ArrayZipSize_和_ArrayZipData_所取代
*存储在_ArrayData_中的N-D数组数据的序列化由列为主改为行为主

要读取JSONLab v1.9或更老版本生成的数据文件,需要在所有loadjson/savejson函数调用中附加选项'FormatVersion', 1.9。要将旧文件(JSON/UBJSON)转换为新格式,您应该运行

data = loadjson(‘my_old_data_file.json’,‘FormatVersion’,1.9)
savejson(“、数据“文件名”、“new_file.json”)

强烈建议您使用新格式转换以前生成的所有数据文件。

千千方

@Rana, JSONLab默认将JSON文件中的所有数值处理为double。如果你看到它读一个单一,请张贴一个测试脚本,这样我可以复制。

这里有一个快速测试

> > = loadjson(“{“b”:1.1}”)
一个=
带字段的结构:
b: 1.1000
> >类(a.b)
ans =
“双”

千千方

另外,如果需要准确性和速度,可以考虑默认使用UBJSON格式(调用saveubjson.m)——它使用强类型二进制数据。

> > a1 = loadubjson (saveubjson(”))
a1 =
带字段的结构:
b: 8589934592
> >类(a1.b)
ans =
“int64”

如果能够手动处理较大的数字,也可以使用字符串存储较长的数字。

千千方

@David Chlemdorff:如果你想保持数据的类型,你需要使用“带注释的数组格式”,在savejson中设置“ArrayToStruct”标志为1。这不是JSONLab的问题,而是JSON的问题,JSON数据不是强类型的。如果你必须使用强类型数据,你需要使用上面的标志(遵循JData规范:https://github.com/fangq/jdata/blob/master/JData_specification.md#annotated-storage-of-n-d-arrays),将数据转换为强类型容器。

这里有一个例子:

%如果你什么都不做,所有的数字都将被解析为双精度
a.b = uint64 (2 ^ 33)
a1 =
带字段的结构:
b: 8.589934592000000 e + 09年
> >类(a1.b)
ans =
“双”

如果你想保持数据类型,你需要使用ArrayToStruct,它使JSON数据强类型
> > a1 = loadjson (savejson(”,“ArrayToStruct”,1))
a1 =
带字段的结构:
b: 8589934592
> >类(a1.b)
ans =
“uint64”

Rana S.Chegani

是否有一种方法从json读取双精度的数字作为双精度值在matlab?如果我有一个具有双精度值的json文件,当前版本在matlab中将其读取为单精度值

大卫Chlemdorff

大卫Chlemdorff

不幸的是,在处理uint64值时,加载参考文件并保存同一文件会再次引入舍入错误。

达尼埃莱

包装很好。我发现一些奇怪的行为与选项SingletArray。它必须设置为1(而不是0),才能对单元素数组也有括号。然而,通过将其设置为1,它添加了相当多的空格和填充。所以如何?

安装说明是什么?

高科技男人

Tago

MATLB也有内置函数jsondecode, jsonencode,检查它的文件超过100k和工作也

千千方

通过开发JSONLab,我考虑过定义一种开放的标准文件格式来存储复杂的科学数据(N-D数组、树、图、列表、表等),使用JSON和对应的二进制(在本例中为UBJSON)作为底层序列化器。所以我在2015年开始了一个名为“JData”的项目,但在过去的几天里只完成了这个规范的第一稿。如果您感兴趣,这里是规范的当前草案

https://github.com/fangq/jdata/blob/master/JData_specification.md

而github存储库专门用于该规范的开发
https://github.com/fangq/jdata

目前,该规范支持以下主要特性:金宝app

1.有或没有数据压缩的N-D数组
2.树、表、哈希、图、链表
3.内联元数据和元数据节点可追加到所有元素
4.数据分组标签类似HDF5
5.索引和查询接口
6.引用和链接支持金宝app
7.双接口文本<->二进制

我很想听听你的想法和建议。在这里免费评论,在github上提交“问题”,或使用邮件列表分享您的反馈,详情请参阅“JData格式规范开发指南”。https://github.com/fangq/jdata

千千方

我的错,我实际上仍然可以访问这个包(与我的个人电子邮件帐户相关联),所以,我将文件更新到最新版本v1.9。

请在这里或twitter上分享您对这个新版本的反馈(#jsonlab)https://twitter.com/hashtag/jsonlab
报告bug在github (https://github.com/fangq/jsonlab/issues

千千方

仅供参考,JSONLab v1.9已经发布,请从(不幸的是,我不能再更新这个页面)下载更新的工具箱
//www.tatmou.com/matlabcentral/fileexchange/68159-jsonlab

新版本支持JSON/UBJSON金宝app数据压缩(zlib/gzip/base64),当存储重复值的大型二进制数组时,可以将文件大小减少10倍到100倍。

它支持金宝app在matlab中保存“字符串”类,也可以处理函数句柄。此外,它修复了以前报告的错误,如转义字符串在loadjson中没有未转义,或64位整数无法保存在UBJSON等。

卢卡斯Tomasik

Tago

优秀的工作

哔叽

1)加载空结构的属性问题,例如"PROPERTY": {}
Loadjson错误地返回'empty double',因此savejson保存为'[]'。
2) savejson还将逻辑写为“1”“0”而不是“真”“假”。

羌族陈

千千方

大家好,我上传了一个新版本的JSONlab (v1.8),你可以从新的githubb连接的文件交换页面下载它

//www.tatmou.com/matlabcentral/fileexchange/68159-jsonlab

如果你有任何关于新版本的问题,请在上面链接的评论区发表,而不是这里。我不再能够更新这个页面中的包。

Ravikumar Gelli

Jens Jenewein

尼古拉斯Blauch

在Matlab<2017a上运行良好,但需要更新以兼容新版本。

Benedikt施密德

埃利兰

STELIOS STYLIANOU

Seeon

目睹了Mateti

我必须在全局声明中包含“len”,以便错误处理正常工作:

第64行

Global pos len index_esc isoct arraytoken

目睹了Mateti

moyuan太阳

hypmfrcl

例子的dat = GEN.json.loadjson('{“obj”:{“字符串”:“价值”、“数组”:[1,2,3]}}”)的失败……

Ulrik

我觉得有点奇怪,数据是用“ANSI”编码保存的,而不是默认的“UTF-8”编码。
看到的:http://www.ietf.org/rfc/rfc4627.txt
您可以考虑添加一个选择编码的选项。

jsonlab什么时候会更新到兼容Matlab R2017a ?在Matlab中使用引号创建字符串数组的新功能干扰了加载和保存函数——我得到的不是字符串数组的单元格数组,而是字符串数组的单元格数组!我发现有可能规避这些变化,但只有在json文件中使用不一致的语法(在方括号内没有双文件分隔符和撇号而不是引号)…

塞巴斯蒂安·D中保

嗨,我在加载json文件时遇到了一个问题,其中文件路径存储在子结构下面的单元格数组中:

a.b.c{1} = '\\myFile\myFile.exe';
a.b.c{2} = '\\myFile\myFile2.exe';
a.b.c{3} = '\\myFile\myFile3.exe';
savejson(“,“Test.json”)

如果你在Matlab中加载json:
aLoaded = loadjson('Test.json');

你会得到:
> > aLoaded.b.c {1}

ans =

“\ \ \ \ myFile \ \ myFile.exe”

有什么帮助吗?

非常感谢

马克•史密斯

我有这个代码的问题。
我有1.5 Gb的Json文件,包含8000个左右的黑白图片,每个75x75像素。我需要解包这个,但出于某种原因,以下json实验室文件破坏了这些图像,这需要大量的时间。
我该如何改正呢?有什么建议吗?

谢谢!

FastCar

如何读取有注释的json文件?我知道json不应该有注释......

亨徐

要保存enum类型变量,在savejson的第174行添加以下内容。M在elseif(isobject(item))前面。不需要更改loadjson。

elseif (isenum(项目))
MC =元类(item);
Item = sprintf('% 1 !%s', mc.Name, char(item));
Item = char(Item);
txt = str2json(名称、项目层面,变长度输入宗量{:});

肖恩胡莉

Savejson不能保存loadjson读取的相同变量。这一行导致它失败:

“ImageType”:[“原创”、“主”、“M”,“和”,“马赛克”),

产生以下错误信息:
未定义函数或变量'st'。
savejson>matlabobject2json错误(第448行)
txt = struct2json(名称、圣级别,变长度输入宗量{:});
savejson>obj2json错误(第175行)
txt = matlabobject2json(名称、项目层面,变长度输入宗量{:});
savejson>cell2json错误(第216行)
txt{结束+ 1}= obj2json(名称、项{i, j}水平+(暗(1)> 1)+ (len > bracketlevel),变长度输入宗量{:});
savejson>obj2json错误(第169行)
txt = cell2json(名称、项目层面,变长度输入宗量{:});
savejson>struct2json中的错误(第285行)
txt{结束+ 1}= obj2json(名字{e},项(i, j)。(名字{e}),…
savejson>obj2json错误(第171行)
txt = struct2json(名称、项目层面,变长度输入宗量{:});
savejson中的错误(第140行)
json = obj2json (rootlevel rootname, obj,选择);

本杰明杆

这就跟你问声好!

我在Matlab中有一个名为Parameters的结构,我想将其保存到一个单独的JSON文件:params.json
我该怎么做呢?
现在我使用下面的代码,但它不工作,因为当我打开我的参数。我得到的东西与我的结构参数无关。

params = savejson(参数,参数);
保存的参数。json的参数

Vinay H

我无法保存json文件使用JSONlab与以下要求。
1)将json保存到以下格式的文件中,即垂直保存而不是水平保存的数组。

“fftSize”:256年,
“melFreqs”:(
4.37407700982649,
9.5610950346158,
14.73937073325675,
),

2)当我保存文件时,我无法指定浮点格式。我尝试使用下面的命令。
Temp = savejson(", h, 'MelReduced. "json”、“FloatFormat ', ' \ t % .16g ');

得到小于误差的值

无效的字段名:'melreduced.json'。

setfield错误(第34行)
s.(deblank(strField)) = varargin{end};

varargin2struct错误(第33行)
选择= setfield(选择,降低(变长度输入宗量{我}),变长度输入宗量{i + 1});

savejson中的错误(第105行)
选择= varargin2struct(变长度输入宗量{:});

请让我知道,如果你有解决这个问题的办法。

基督教Heigele

要修复2017a中的“st”问题,请将l.211替换为以下代码片段(也在https://github.com/fangq/jsonlab/issues/37):

tmpobj = eval (arraystr);
断言(iscell (tmpobj));自matlab 2017a ["GML", "XML"]产生一个有效的字符串数组
对象= tmpobj;

磁悬浮

彼得·范登·比格拉

下面的代码给出了一个错误:
>> loadubjson(saveubjson(", 0.000132))

在saveubjson的第300行找到了rootcause:
numtxt = regexprep (regexprep (matdata2ubjson(+ 1项,水平,变长度输入宗量 {:}),'^\[',''),']','');

我用(在']'后添加'$')修复了这个问题:
numtxt = regexprep (regexprep (matdata2ubjson(+ 1项,水平,变长度输入宗量 {:}),'^\[',''),']$','');

安德鲁•史密斯

以前在Matlab 2016b和更早版本中工作的调用在Matlab 2017a中不能工作。我现在从savejson得到:

未定义函数或变量'st'。

savejson>matlabobject2json错误(第448行)

txt = struct2json(名称、圣级别,变长度输入宗量{:});

内森•齐默尔曼

遗憾的是,它在枚举类型上似乎失败了。除此之外,似乎还可以

千千方

@Paul,最好的开始是运行“help savejson”和“help loadjson”并阅读格式。您还可以编辑演示脚本并查看调用示例。

千千方

@Marcel, a=[1;2;3]不是行向量。它是matlab中的一个列向量。

如果将a更改为[1,2,3],那么jsonlab将为您提供所需的输出。

马大

是否有任何方式,一个行向量,如a=[1;2;3]仍然是json输出的1D数组?

{"a":[1,2,3]}而不是{"a": [[1],[2],[3]]}

保罗•

我有点搞不懂这个工具箱是怎么用的。我已经下载了它,将它添加到我的path目录中,并运行demo_jsonlab_basic。但我不确定输出代表什么。

对于我自己的使用,我有json格式的文件,描述某些“社交网络”,我希望从他们获得相应的邻接矩阵。我可以用你的包来完成这个吗?如果可以,我该怎么做呢?多谢。

anaston

我为之前的评论感到抱歉,我把它打错了标签…

anaston

哔叽Kogan

太好了!
非常感谢!

在JSON页面上,它声明:

字符串是由0个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义。

它还指出,a a字符是:

“any-Unicode-character-except——“或者——\ -or-control-character”

这些控制字符如下:

\”
\ \
\ /
\ b
\ f
\ n
r \
\ t
\ u four-hex-digits

我理解的这一点应该被解释为,正斜杠<本身>不应该被解释为转义字符,而只有当它前面有反斜杠时,才应该被解释为转义字符,因为正是这个组合被显式地声明为转义字符。在描述字符串(http://www.json.org/string.gif)它还显示所有控制字符前面都有一个反斜杠。

问题是save函数似乎将目录的正斜杠(在matlab中保存为字符串)解释为转义字符。此外,当在这个新创建的文件上使用loadjson函数时,它将目录中的\/解释为正斜杠,这将是第二个特性。

我认为问题出现在验证转义字符时使用正则表达式,但具体如何我不能说。不管怎样,如果遵循JSON规范,这似乎是实现的意外行为。

如果它有任何区别,我正在使用运行在OSX El Capitan上的matlab2014b,但据我所知,在matlab上使用正则表达式时,这应该不是一个问题。

希望我的观点是清楚的!

千千方

@Joe,我相信“/”是JSON字符串中的转义字符之一。请检查http://www.json.org/并参阅“string”规范。

你好,我在使用savejson时遇到了一个问题。如果我在matlab中有一个名称/值对,它应该是这样读的:

“目录”:“/我的/ home /目录”

当我使用savejson函数时,它会生成一个具有名称/值对的JSON:

“目录”:“\ / \ / \ /目录”

由于正斜杠主要不是转义字符,这对于函数来说似乎是一个奇怪的行为。我通过escapejsonstring,我不确定为什么会发生这种情况。如果我从escapechars列表中删除('\/'),那么我将得到所需的名称/值对,但这似乎在某些地方可能会出现问题,尽管对于我当前将目录作为值写入JSON文件的目标来说已经足够了。

除了不能使用“\/”作为转义字符外,这还会产生其他问题吗?这对现在来说是一个足够的解决方案吗?

谢谢你!

威廉Ottevanger

瞿Juntao

它的工作原理!
非常感谢倩倩!!

千千方

@君涛,matlab不会替换数据中的“i”和“j”。Link_i_j通过您定义的值。字段名“link_i_j”只是一个字符串。

要使用i/j动态创建一个字段名,你应该使用字段名操作符:

数据。(sprintf(链路% d_ % d ', i, j))

试一试。

瞿Juntao

你好,我在加载数据时遇到了一个问题。
假设我的json文件名是filejson。它的工作原理如下:

> > loadjson(“filejson”)

ans =

Link_16_14: [1x1 struct]
Link_16_15: [1x1 struct]
Link_16_16: [1x1 struct]
......
> > data.link_16_14

ans =

MD_capac: 6.0000 e + 03
term_node: 8
MD_flow_minute: [1x120 double]
link_idx: 16
......

但是当我想使用一个定义的变量而不是值时,它会出错:
>> I = 16;
>> j = 14;
> > data.link_i_j
引用不存在的字段'link_i_j'。

谁能告诉我为什么,怎么解决?因为我需要使用for循环来调用json文件中的数据。
万分感谢!

Vinit

干得好
我能够将JSON转换为sldd,但不能将基本工作区数据转换为JSON。

Jonn Lantz

在savejson中第256-258行发现一个错误。空结构体产生单元格输出。将这些行上的{}替换为[]

千千方

@Jonathan,当你说“仍然无法解析”时,我不确定你指的是什么。设置FastArrayParser允许它被解析和来回转换。试试这个:

A.foo = {1, [2,3]};A.bar = [1,2,3];
a1 = loadjson (savejson(”)、“FastArrayParser”,0)
a2 = loadjson (savejson(“loadjson (savejson (a),“FastArrayParser”,0)),“FastArrayParser”,0)
isequal (a1, a2)

在没有FastArrayParser=0的情况下调用loadjson时的错误是一个已知的问题,现在已修复,请参见

https://github.com/fangq/jsonlab/issues/5

乔纳森

将每个数组转换为单元格数组并不能解决问题,而是避免了问题。这个解析器仍然不能解析简单的结构:

A.foo = {1, [2,3]};A.bar = [1,2,3];

千千方

@Jonathan,简单回答,用这个:

res = loadjson (savejson (" foo),“FastArrayParser”,0)

github上的这个问题跟踪器回复了一个详细的答案:

https://github.com/fangq/jsonlab/issues/27

兰斯

非常好的工具箱,这正是我想要的,谢谢

乔纳森

@千千方,这里有一个简短的例子,不知道怎么格式化,这个工具箱有GitHub repo / SO标签吗?

> > foo。bar = {1,2,3}

foo =

酒吧:{[1][2][3]}

> > savejson (" foo,“文件名”、“foo.json”);
>>

“酒吧”:(
1,
2,
3.


>> baz = loadjson('foo.json')

巴兹=

酒吧:[1 2 3]

千千方

@Gabriel Zienert,你说的没错。在0-1替换之前,指定FloatFormat首先将逻辑更改为浮点字符串。我会想个更好的办法。

千千方

@Jonathan,你能给我举个例子吗?

乔纳森

读取器无法正确解析写入器的输出!(即,转换是不可逆的)

示例保存和加载标量数的单元格;编写器将单元格转换为JSON输出中带有数字项的数组(我希望是带有单线态数组项的数组),然后在加载回Matlab时将其解析为数字数组。

为save设置'SingletArray',为load设置'SimplifyCell',或设置/取消设置的任何组合,结果与标量数字的单元格不同。

在保存浮点数和逻辑时,我使用savejson (v1.2)遇到了一个问题。试试这个:

savejson(“结构(“浮动”,π,“逻辑”,真的),‘FloatFormat’,‘% .2f’,‘ParseLogical’,1)

你会得到:


“浮动”:3.14,
“逻辑”:true.falsefalse

似乎逻辑被格式化为浮点数,然后'0'和'1'被'true'和'false'取代。

千千方

@Julia,如果你想从这两种情况下输出1x2单元格,你应该尝试'SimplifyCellArray',试试这个:

s = loadjson('{“s”:{“chType”:[“没有”,“没有一个”]}}’,‘simplifycellarray’,真的)

s.s.chType

s = loadjson('{“s”:{“chType”:[“没有”,“非”]}}’,‘simplifycellarray’,真的)

s.s.chType

茱莉亚Radoszycki

你好,
当使用“SimplifyCell”选项为true时,我有一个laodjson问题。
下面是2 json的内容:
Test1。json: {"s":{"chType":["None","Non"]}}
Test2。json: {"s":{"chType":["None","None"]}}
如果我做mysUser1 = loadjson('test1.json','SimplifyCell',true);我像往常一样获得一个1x2单元格,但当我做loadjson('test2.json','SimplifyCell',true);我得到一个char 2x4。似乎只有当两个字符串的字母数量相同时才会这样。
您已经注意到这个错误了吗?我如何修复它(我需要选择SimplifyCell出于其他原因)?
提前谢谢你
茱莉亚

Ramadev Hukkeri

杰黄

Natarajan

嗨,倩倩,这是一个很棒的工具箱,工作真的很好。我有一个问题-你能做一个更新来合并Map容器(像哈希映射),这是非常类似于json。现在,它试着把它写成矩阵,把错误写出来。

绍兴李

谢谢你的util。对我来说挺好的。

扎基

谢谢你的util。您能调试这个简单的问题吗?

K > > loadjson (savejson(“{' a ', ' b '; ' c ', ' d '}, hey.json))

ans =

{1x2 cell}

对于其他需要短期解决编码矩阵问题的人,请使用http://vision.is.tohoku.ac.jp/~kyamagu/software/json/

优秀的实用工具,快速使MATLAB数据与内置导入器/导出器的Python脚本共享。

千千方

@Eric

谢谢反馈,你介意提交一个或多个跟踪这些问题在github?它将帮助我们记录这些变化,并促进进一步的讨论。这是链接

https://github.com/fangq/jsonlab/issues

埃里克

嗨,我想建议一个有效的空JSON修复,如:
{}
[]
[{},{},{}]

对loadjson.m
第66行——应该是“。用“*”代替“。+”
固定66:如果regexp(帧,^ \年代 *(?:\[.*\])|(?:\{.*\})\ * $”、“一次”))

第123&132行:JSON中的“{}”在Matlab中是空结构。应该是“struct([])”而不是“[]”。然后需要对空结构进行索引(参见第132行)。
固定123:对象= struct([]);
修正132:对象(1).(valid_field(str))=val;

第207和208行:可以在这里插入assert来检测对象。“{}”将被Matlab计算为一个空单元格,但它应该是一个结构。
在207之后添加(内部尝试):
assert(isempty(regexp(arraystr,'\{','once')),'如果JSON中包含对象,则跳过eval ');

savejson.m:
在第216行,一个单元格被放入TXT单元格(应该是一个字符串单元格数组)的错误。txt单元格应该被连接起来。

是216:
txt{结束+ 1}= obj2json(名称、项{i, j}水平+(暗(1)> 1)+ (len > bracketlevel),变长度输入宗量{:});

应该是216:
txt = [txt obj2json(名称、项{i, j}水平+(暗(1)> 1)+ (len > bracketlevel),变长度输入宗量{:}));

对于空对象,第258行应该是“{}”而不是“[]”。
是258:txt={padding0, '[]'};
应该是258:txt={padding0, '{}'};

Alexey精英

千千方

@Eoin,我相信你只需要多一对花括号,就像这样:

> > savejson(“结构(“标签”,{{‘somename’,‘somelongername}},“param1”,1000年,“param2”,“关闭”))

ans =


“标签”:[
“somename”,
“somelongername”
),
“param1”:1000年,
“param2”:“封闭”

千千方

@Jana, Sert金宝appan Senturk最近在以下两个pull请求中贡献了对导出matlab对象的支持:

https://github.com/fangq/jsonlab/pull/10
https://github.com/fangq/jsonlab/pull/11

我个人还没有对此进行广泛测试。

你介意为此打开一个Github问题吗?提供一个示例脚本来说明这个问题就太好了。谢谢

https://github.com/fangq/jsonlab/issues

千千方

@Paul,谢谢。Jon Dufour早前也指出了这一点。修复在1月7日提交(见我在那一天的回复)。

保罗

嗨,不错的工具箱,只是一个快速的错误修复:

savejson(“struct.empty (1,0))

给出一个错误,可以通过在第259行之后插入以下行来修复:

TXT = sprintf('%s', TXT {:});

Eoin穆雷

我想保存一些元数据,发送到我实验室中使用的REST API:

我在一个单元格数组中有一些标签,但是我不知道如何将matlab结构转换为标准的json兼容格式。

例如:

' ' '
Savejson (", struct('tags', char({' someename ';'somelongername'}), 'param1', 1000, 'param2', 'closed'))
' ' '

给:

' ' '

“标签”:[
“somename”,
“somelongername”
),
“param1”:1000年,
“param2”:“封闭”

' ' '

您可以看到在标记数组中有额外的空白
对于“someename”字符串,这是因为matlab数组需要有固定大小的元素。

然而,如果我把标签作为一个单元格数组,就像这样:

' ' '
Savejson (", struct('tags', {' someename ';'somelongername'}, 'param1', 1000, 'param2', 'closed'))
' ' '

我得到:

' ' '



“标签”:“somename”,
“param1”:1000年,
“param2”:“封闭”
},

“标签”:“somelongername”,
“param1”:1000年,
“param2”:“封闭”



' ' '

这显然不适合发送到互联网上的典型web服务。

有没有办法让jsonlab从单元格数组创建一个标准json数组而不需要额外的文本填充

Jana

嗨,这是一个很棒的工具,我发现它非常有用。谢谢!!我只有一个问题:它对结构很有效,但对对象就不行。如果我试图导出一个对象,它会给我一个错误:“达到最大递归限制500。使用set(0,'RecursionLimit',N)来更改限制。请注意,超过可用的堆栈空间会使MATLAB和/或崩溃
你的电脑。”有什么合理的方法可以解决这个问题,同时又不会使计算机处于危险之中吗?

欢呼,

Jana

千千方

@Robin,试试这个

>> reloadedstruct = loadjson(jsonstruct,'SimplifyCell',1);

> >类(reloadedstruct)

ans =

结构体

SimplifyCell标志允许jsonlab在支持的情况下将单元格数组转换为矩阵/结构数组。金宝app

罗宾

谢谢你的好工具,我正在成功地使用它!
但是,我在结构数组方面遇到了一个问题。
在下面的代码中,我将一个结构数组转换为json和返回,但我最终得到一个单元格数组回来。
我还没有找到这到底发生在哪里,但我仍在寻找一种方法。

Substruct1 = struct('a',1,'b',2);
Substruct2 = struct('a',3,'b',4);

Teststruct = struct([substruct1,substruct2]);

Jsonstruct = savejson(",teststruct);

Reloadedstruct = loadjson(jsonstruct);

千千方

感谢乔恩。出于某种原因,这在我所有的回归测试中都被忽略了。这里提交了一个补丁,它应该可以修复这个问题。

https://github.com/fangq/jsonlab/commit/e07e91f5ec8f7caf210722348af9603f2145a409

刚开始使用这个,但似乎是一个伟大的工具,到目前为止,谢谢!我注意到的一件事是,在尝试使用0x1结构体savejson()时,我得到了一个错误。当然,0x1结构体很奇怪,可能不经常出现,但我想让你知道!如果你想重新创建(我使用Matlab 2015b),试试这段代码:

s.Field1 = 'Test';
S (1) = [];
savejson (s)

再次感谢!

千千方

供您参考,新版本(v1.2)已上传到FileExchange。享受新年快乐!

千千方

对于每个人来说,通过消除字符串连接,我能够将savejson的速度提高2.3倍,这是@Samuel提供的见解。

详见github Issue#17

https://github.com/fangq/jsonlab/issues/17

并从github下载最新的代码。

@倩倩,我用这些文件在github中创建了第17个问题。欢呼。

千千方

@Samuel,我们有一个问题跟踪器,用于加速github上大型JSON文件结构的loadjson

https://github.com/fangq/jsonlab/issues/9

但我们还没有花时间优化savejson的速度。

你能否在github上创建一个单独的问题,并发布补丁或拉请求,以便我可以查看更改?

此外,在JSONlab中有一个内置的速度基准测试

https://github.com/fangq/jsonlab/blob/master/examples/jsonlab_speedtest.m

想知道你的补丁如何改变性能。

非常有用,然而,在上一个版本中,复杂数据集到JSON的转换仍然非常慢,即使在快速的计算机中,主要是因为在内部整个机制存在于字符串连接,有时甚至使用中缀连接,这是非常低效的。所谓复杂数据集,我指的是包含数千个条目的单元格数组,每个条目的结构包含30个或更多字段,其中一些包含大型2D数组。由于有大量的单独对象,当添加更多的对象时,字符串连接就变得很麻烦。

我写了一个姐妹函数savejson_fastfile,它替换了大部分sprintf到fprintf(fid…为了重定向输出,我不得不在那里和那里做一些改变,以避免中缀连接,但这并不难。我唯一留下的字符串连接是在函数matdata2json周围,主要是因为sprintf(formatstr,mat')的输出确实需要一些搜索/替换才能生成正式的JSON字符串。

在我的例子中,savejson_fastfile需要53秒vs 150秒使用save_json来保存具有49,000个对象的JSON流,包括各种混合大小的数据(单个值、字符串、小矩阵和大矩阵)。大概是3X的速度。测试计算机是双至强E5-2640 @2.5 GHz(共12核)和32 GB RAM。两个函数生成的文件是相同的。

如果你想看一下新功能,请告诉我。非常感谢分享你的图书馆。

千千方

@Hüseyin,关于你关于处理空数组、结构体和单元格的问题,昨天,我提交了一个补丁来控制单元素单元格/数组的括号,

https://github.com/fangq/jsonlab/issues/8#issuecomment-164044337

我发现它对空数组、单元格和结构也有影响。有了这个补丁,您现在可以得到以下结果

> > obj ={{}[],结构()};
> > savejson (obj)

ans =


“obj”:(
空,
[],



但这不是一个健壮的解决方案,因为更多的loadjson/savejson迭代将把它们全部转换为null。

问题的根源在于JSON数据和matlab结构之间的模糊性和一对多的映射。

千千方

@Hüseyin,感谢您的报道。github上的另一位用户也报告了这一情况。我昨天发布了这个问题的修复,看到我的回复

https://github.com/fangq/jsonlab/pull/16

请从github签出最新版本,然后重试。

git克隆https://github.com/fangq/jsonlab.gitjsonlab

Huseyin

首先:谢谢你的工具箱!: -)

下面是一些使用Matlab 2015b的问题:

将Json保存到选项“FileName”的文件中的问题,. 0
例如savejson(“json2data“文件名”,“myFile.json”)

在varargin2struct。M你使用lower() setfield(),所以你有opt.filename和所有其他选项注册小写。

在savejson。M第147行你有问题了
>> fid = fopen(选择。文件名,wt);

您尝试访问opt.FileName,它不存在,因为它是区分大小写的。

所以请解决这个问题:
>> fid = fopen(选择。文件名,wt);

检查其他选项,因为所有选项都是用小写字母定义的。

PS:错误可能也在
>> Line 99, new: opt=struct('filename',varargin{1});
>>第144行,new: fid = fopen(opt. fopen)文件名,“世界银行”);

Huseyin

JSON文件中的“null”输出有一个问题,这使得它不兼容,因为我期望{}而不是“null”。

看到loadjson。M函数parse_object()第123行:

你使用:object = [];
输出——> "mykey": null,

BETTER: object = struct();
输出——> "mykey": {},

这个快速破解用{}替换“null”条目

你能解决这个问题或者至少添加一个选项吗?

冯建英

杰森

用你的工具箱救了我一命!非常感谢!

罗伯•坎贝尔

完成任务。谢谢!

Timo Korthals

@Qianqian

我正在使用mathworks的当前版本。
我将进一步讨论到github。
我的一些修改导致您的解析器在第一次运行时大幅加速,所以也许我们可以做出贡献。

千千方

@Timo

您能确认您使用的是最新版本v1.1吗?我在这个版本中做了一些更新,以加速进度条和jstruct2array函数。参见提交日志

https://github.com/fangq/jsonlab/commit/2acca6745b7d6f47f3fb397fd598f51db7106353#diff-e4e4bc9fba80ed2220686f019637f986L203

Timo Korthals

@Qianqian

我就是这么做的。
我对json2data()函数进行了概要分析和计时,递归部分是最详尽的部分。
第二个是进度条,如果你打开它的话。
也许你应该减少调用,例如,每5%更新条,而不是在每个循环。

无论如何,在内核空间中花费的时间与JSON对象的深度紧密相关。
我用不同的结构化文件进行了测试。

最后,webread()函数在最后调用decodeJSON()(或decodeJSONstream()),它以递归的方式解析数据,就像您的代码一样。
因此,不支持C转换。金宝app

千千方

@Timo

我不知道你是怎么得出这个结论的。如果我是你,我会从数据中取出1MB的样本并运行剖析器。解析时间与JSON数据的复杂性密切相关。你永远不知道瓶颈是什么,除非你分析它。

正如我在前一篇文章中提到的,JSONlab的执行速度比Matlab 2015 webread()快30%。我不知道webread是不是非递归的,但我相信它是编译的。

Timo Korthals

在内核空间中花费的运行时和处理时间与JSON对象的嵌套深度相关。
这主要是由于解析器中使用了递归函数造成的。
是否有方法构建非递归解析器?
这还有助于将代码转换为mex函数,以加快解析速度。

Timo Korthals

到目前为止做得很好,但我有一个问题。
我正在加载约1GB大小的JSON文件。
虽然它仍在解析(从12小时开始),但我观察到在Linux下,该进程在内核空间中工作了大约30%。
这里发生了什么?
您的工具包中是否有额外的文件IOs或系统调用?

我用下面的方法从Bash调用MATLAB:
matlab -nodisplay -r "opt. simplifycell = 0;FastArrayParser = 1;addpath('./jsonlab');json2data=loadjson('myJsonFile. txt ');json,选择);保存(myJsonFile.mat);出口”

我运行r2014b。
你有什么建议,如何加快解析?

谢谢你!这很有效。

完美-谢谢!

千千方

@Christopher:是的,这可以通过定义一个逻辑变量并设置“ParseLogical”标志来实现。下面是示例代码:

a.field =逻辑(1);
savejson (' a ',‘ParseLogical’,1)

谢谢你把这个非常有用的工具箱组合在一起。由于程序的特殊性,我正在运行,我需要插入一个字符串到我的json文件没有引号。当我赋值field = 'true'时,它将json文件打印为"field": "true",但我需要它打印"field": true

这可能吗?谢谢!

弗兰克

非常好的屈服!我有一个关于保存一个元素的单元格数组到json的评论。

目前,savejson只在单元格数组至少有2个元素时添加方括号,而在单元格数组只有一个元素时则完全忽略方括号。在某些应用程序中,当过滤带有方括号的特定json结构时,这可能很烦人。

这可以通过修改子函数“cell2json”来调整。只需在三个实例中将“len>1”替换为“len>0”,即“savejson.m”中的line=183,201和214。

也许这是将来可以改进的,让用户决定是否在单元格数组中使用一个或多个元素的方括号。

韦斯·鲍德温

千千方

只是为了让您知道我已经上传了JSONlab 1.1。请试一试吧。它应该更快(对于大文件,要快得多)。

以下是完整的更新日志:
http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab/Doc/ChangeLog

千千方

@Vlad,你能给我一个例子,什么是“真正的预挂JSON文件”吗?如果它与其他核心功能不冲突,我很乐意把这个支持放回去。金宝app

千千方

@杰里米,抱歉耽搁了。一直在忙截止日期。

关于你的第一个问题,是的,我确实使用JSON和UBJSON来存储(部分)我的研究数据。它们对我很有用。我的许多研究数据仍然以其他格式存储(原始二进制,文本,csv等),我正在慢慢迁移到JSON/UBJSON,因为我的许多研究项目涉及自制的处理软件,而不是matlab。我必须首先在我的软件中添加JSON/UBJSON支持,以便转换金宝app所有内容。

对于Q2, JSONLab 1.0或更早的版本支持Draft 金宝app9。在我即将发布的新版本v1.1中,字符串格式更新为Draft 12。看到

https://github.com/fangq/jsonlab/commit/4e88f2f60fb6aa85135e977de638dd62fea5856a

关于你对使用JSON/UBJSON存储科学数据的评论,我完全同意你的观点,这些格式非常适合你的目的。事实上,我目前正在研究一种基于JSON/UBJSON的格式规范,专门用于存储科学数据(部分由NIH拨款资助)。我称之为“JData规范”,这里是不完整的草案:

http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab/Doc/JData

将来,一旦该规范最终确定,JSONlab可能会与该规范保持兼容。

弗拉德Atanasiu

很好,我们现在有一个服务员!版本2014/09/17有一个有用的功能:真正的预挂JSON文件。也许我们可以在未来的版本中找回它。谢谢!

杰里米

杰里米

嗨,倩倩,我有几个问题:
1.你使用ubjson还是json来存储你的数据?
2.jsonlab实现了什么UBJSON草案版本?

我问这个问题是因为我想找到一种存储科学数据的格式。纯json的可移植性更好,但性能要比ubjson差得多(在精度/文件大小和编码/解码时间方面)。

千千方

@Jan。我同意。有很多地方可以改进。特别是,loadjson的主要结构是从以前的工作中派生出来的(请参阅上面的致谢部分)。虽然它可以工作,但显然没有优化。我一直在抛光/优化loadjson,从最耗时的部分开始向下移动。我还没有像你建议的那样处理低优先级的问题,但它很快就会出现(可能现在是一个好时机)。

顺便说一下,说到速度,有些人抱怨loadjson的解析速度太慢。我最近注意到一个用户提供的大(>2MB) JSON文件。我对代码做了一些优化,现在loadjson对于某些类型的文件来说要快得多(>20倍)-它甚至比MATLAB 2015内置的webread() JSON解析器还要快!

对于那些感兴趣的人,从github签出最新版本。我将很快发布JSONlab 1.1。

https://github.com/fangq/jsonlab

解析一个包含150k非结构化小节点的JSON文件,我们只需要99秒,而在同一台计算机上,git版本的loadjson只需要72秒。它快了近30%。

1月

代码中仍然存在一些糟糕的编程方法,例如具有标准名称“pos”或“len”的全局变量,以及由丑陋的“eval(sprintf('对象)”创建的字段。%s =val;', valid_field(str)));",尽管动态字段名称"object.(valid_field(str))=val"已经工作了10多年。

此外,STRMATCH速度慢得令人惊讶,而且过时了。使用STRCMP会更有用。

当一行中只包含一个命令时,代码更容易阅读,并且更好地支持JIT加速。金宝app我不认为有理由将其移动到1行:“nstr =长度(str);开关inStr (pos)”。

提交文件包含详尽而有用的帮助部分。我建议改进上面提到的编程技术,以便在高效的环境中可靠地工作。

艾尔大卫

非常谢谢! !

千千方

@Elkin,你的问题与Kyle早前(2015年1月14日)发布的问题类似,你必须使用一个额外的参数“FastArrayParser”,以防止单元格数组崩溃,

loadjson (' test.json ', ' FastArrayParser ', 2)

默认情况下,jsonlab通过调用cell2mat将单元格数组简化为数组。将FastArrayParser设置为正数将设置分组的起始级别。

将FastArrayParser设置为0将禁用分组,JSON数组中的每个元素都将成为一个单元格。

艾尔大卫

我有一个问题导入这个json

%%%%%%%%%%-- 开始 --%%%%%%%%%%%%%%%%%


“数组”:(


(1、2),
(1、2),
[1,2]
),

(1、2),
[1,2]


%%%%%%%%%%% 结束 %%%%%%%%%%%%

当我存钱的时候发生了这样的事

%%%%%%%%%% start %%%%%%%%%


“数组”:(


(1、2),
(1、2),
(1、2),
(1、2),
[1,2]


%%%%%%%%%%%%%%%% 结束 %%%%%%%%%%%%%%%

=(

千千方

@gvoysey,不,UBJSON是一个新的规范,结构与BSON完全不同。在我看来,它更简单,也更容易使用。你可以在这里找到更多细节http://ubjson.org

然而,它仍在开发中。规格有不同的版本,例如,Draft 8,9,10,12…不幸的是,这些规范不向后兼容。

JSONlab 1.0基于UBJSON Draft 9。但是,最新的JSONlab开发分支已更新到Draft 12。此外,我使用了一种扩展的语法来表示ND数组,并向UBJSON的开发人员提出了这个建议,然而,到今天为止,它还没有被纳入规范

https://groups.google.com/d/msg/universal-binary-json/tgMCEbOmhes/s7JlCl58hvQJ

您看到的错误可能是由这些已知的兼容性问题引起的。当它失败时,您是否看到特定的错误消息?

gvoysey

嗨,千千,

我对UBJSON感到困惑。这是BSON的另一个名字吗?我有一些麻烦插入序列化输出从您的工具箱到MongoDB使用他们的社区支持的matlab驱动程序,并没有能够找到一个好的指南。金宝app

我认为我所做的一切都是“正确的”,但是以一种它不期望的格式提供数据库数据。

谢谢你的澄清!

千千方

@Michal,说到“非常慢”,你把jsonlab和什么做了比较?

你的计时包括文件IO吗?如果是,我会建议您简单地以字符串的形式返回输出,而不是写入文件。写入大文件的IO成本可能很大,特别是在非固态磁盘上。

米甲Kvasnicka

非常慢的保存功能大json文件(> 100k行)

米甲Kvasnicka

Samaksh Behl

使用JASONlab可以在PDF中创建标记/注释吗?

谢谢!

千千方

@Graham,你的输入,json,并不是一个对象。它是一个字符串。基于JSON语法,字符串内的双引号需要转义,因此反斜杠,参见http://www.json.org/

要将json转换为实际的matlab对象,您需要这样做

jsonobj = loadjson (json);

然后你可以将jsonobj保存为JSON字符串:

savejson (jsonobj”)

如果你想做的只是将一个已经转换的JSON字符串保存到一个文件中,你可以只使用标准的文件IO函数- fopen/fprintf/fclose,不需要使用savejson。

格雷厄姆·华纳

为什么savejson在字符串中添加反斜杠?我有一个对象“json”,它读:
> > json

json =

{“持续时间”:16420.479075,“Num_Samples”:40000年,“频率”:13449312,“Num_Channels”:17}

然后当我试图保存它时,我得到反斜杠:
> > savejson(“,json /空间/ jazz / 1 /用户/ gwarner / jason.mat ')

ans =

“{\ \时间:16420.479075,\“Num_Samples \”:40000年,\“频率\”:13449312,\“Num_Channels \”:17}”

千千方

@Pinghung,首先,loadjson函数来源于parse_json。M是你作为参考的。我相信有一个简单的调整来恢复旧的行为。您是否对这两个代码进行了剖析(剖析在;loadjson(…);概要文件查看器)?它能马上告诉你区别在哪里。

其次,对特殊输入进行优化以获得良好的速度是相当容易的(再次强调,使用matlab分析器是一个很好的开始),在我看来,更难实现的是优化代码,使其能够为大多数类型的输入获得良好的速度。这通常需要一个平衡的解决方案。在之前的工作中,loadjson的变化主要集中在加速大型数组的解析,这是matlab用户最常遇到的问题。尝试运行内置的速度测试基准,您将看到差异。

https://github.com/fangq/jsonlab/blob/master/examples/jsonlab_speedtest.m

第三,尝试不同版本的matlab,我发现matlab的后期版本在运行loadjson时快了~10倍。

PS:随时给我发电子邮件(fangqq at gmail.com)你输入的JSON文件,这样我就可以知道loadjson到底发生了什么。

千千方

@Laurent,你可以禁用FastArrayParser
将其设置为0,例如:

A = {8,9};
loadjson (savejson(”)、“FastArrayParser”,0)

这将强制将所有容器(数组/对象)处理为单元格。

劳伦特

这太棒了!
但有一点:单元格数组变成了矩阵;我怎样才能避免这种行为?
例:
A = {8,9};
savejson(“、“f.mat”);
B = loadjson('f.mat');
> b现在是1-x-2矩阵[8 9]
非常感谢你的帮助

马克Mikofski

平鸿,你试过Java实现组织吗?json或。net实现的json。NET和fastJSON。我在这篇无文档的MATLAB文章中解释了如何使用它们:http://undocumentedmatlab.com/blog/json-matlab-integration要点如下:https://gist.github.com/mikofski/2492355

Pinghung

比parse_json.m等其他实现慢得多。我们需要快速反序列化从JSON API获取的数据集。将需要找到一个更快的方法在Matlab反序列化。

指标1:
反序列化500个JSON数据点(每个数据点都有嵌套数据)

parse_json。米0.785秒
loadjson。米3.914秒

指标2:
反序列化5000个JSON数据点(每个数据都有嵌套数据)

parse_json。M 7.837s(线性缩放)
loadjson。m停止测试3分钟后,100%的CPU消耗。

伊恩•罗宾逊

千千方

@Alexander,你需要使用SimplifyCell标志,像这样:

loadjson (savejson(“structarray) SimplifyCell, 1)

亚历山大·蒙特

我注意到,当我在Matlab中保存一个结构数组,然后再次加载json文件时,它变成了一个单元格数组。有没有办法阻止它这样做?

千千方

hi Kyle,你需要使用下面的命令来重现输入:

y = loadjson (myjson FastArrayParser, 2)

如果分支可以折叠(通过cell2mat), FastArrayParser将控制输出单元格数组的深度。0禁用该特性。试着将它从0设置为3,看看有什么不同。

在未来,我同意loadjson应该在可以简化的层面上更加智能。

凯尔

你好,方倩倩,

我无法从你的软件中恢复包含数字的单元格。例如:

X = {[1],[1,2],[1,2,3]};
Myjson = savejson('data',x);
Y = loadjson(myjson);

在上面的例子中,y不等于x。我希望y像x一样是一个单元格,但是x中的数字被折叠成一个数组。你能不能修改一下你的代码,让输入和输出相等?

千千方

@Calos,我认为你需要的是一个矢量转置,看我的例子:

一个=兰德(100 1);
savejson(‘myvar#’,”)

这对你有用吗?

千千方

大家好,JSONlab 1.0来了!享受

卡洛斯

你好,方倩倩。我有一个变量,这是一个100x1双,我想转换成JSON在以下形式:


“myvar”:[num1, num2, num3…],

我尝试将“myvar”转换为char和cell,但我没有实现这种形式。
谢谢你的努力。

Macey保罗

当我遇到JSONlab时,我已经开始编写自己的解码器,这为我节省了很多精力。谢谢你的贡献。

千千方

一个进度条现在被添加到loadjson中,请参见最新的SVN提交:

http://sourceforge.net/p/iso2mesh/code/452/

使用loadjson(…,'ShowProgress',1)来激活此功能。

b

当它在数据文件中加载每个记录时,是否可以在提示符上输出记录号?如果记录的数量太大,游标是否可以给出文件读取量或记录读取数的百分比?谢谢。

千千方

不幸的是,使用//或%的JSON注释不是规范的一部分。一种常见的解决方法是将注释放入具有特殊名称的元素中,例如“_help”或“::comment::”等,加载整个对象,但不使用这些值。JSONlab可以处理名称字段中的特殊字符,因此可以非常有区别地命名注释。

b

你好,千千,

如何使用%或//或其他任何东西来注释json文件中的特定字段,以便loadjson不会给出错误:
使用loadjson>error_pos错误(第431行)
JSONparser:invalidFormat:以" expected at position 3267 "开头的字符串:
30:02.091Z”,

或者,如果我们想跳过一个字段,而加载(说,“_id”:),有办法做到这一点吗?

谢谢。

千千方

@tmartin

现在支持紧凑的JSON输出,请看我最近的提交:金宝app

http://sourceforge.net/p/iso2mesh/code/449/

添加('Compact',1)到savejson参数列表来启用此功能。

现在唯一留下的格式化空白是冒号之后的空格。我将在以后的更新中删除它们。

千千方

@Nicolas

我在最近一次提交中添加了请求的帮助信息,请看

http://sourceforge.net/p/iso2mesh/code/448/

千千方

@Alessandro

谢谢你指出这个问题。这确实是一个与我添加的快速数组解析器相关的错误。我并没有很好的解决这个问题,因为这与matlab eval()命令如何处理输入字符串有关。但是,我只是向loadjson添加了一个选项,允许您跳过一些数组维度的快速解析器。

查看我的变化:

http://sourceforge.net/p/iso2mesh/code/448/

您的示例可以使用

B = loadjson('temp.json','FastArrayParser',2)

如果您看到与此更改相关的任何附加问题,请告诉我。

尼古拉。

非常感谢你的工作。
是否有可能获得一些解析选项的信息,这些选项可以作为输入参数传递给loadjson函数?
我在工具箱主页上看了一下,但什么也没找到。
谢谢你的帮助。

Timo Dorsam

tmartin

是否有一种方便的方法来生成JSON文件的紧凑形式?

T Lankhorst

我对这个软件的速度和可用性感到惊讶。

T Lankhorst

亚历山德罗

嗨,千千,

感谢您提供这个非常有用的库。

我想报告它看起来像一个bug。我注意到,如果一个cell-array包含具有相同列数的矩阵,并保存/加载它,库将垂直连接矩阵,输出单个矩阵。请看下面的代码:
A = {rand(2,4), rand(3,4)};
savejson(", A, 'temp.json');
B = loadjson('temp.json');
谁是A

输出:
Name Size Bytes类属性
一个1x2 384单元格
B 5x4 160双

Joerg布赫兹

千千方

你好,理查德。

欢迎分享你的补丁/更新,给我发邮件:fangqq gmail.com。我将检查它并将其提交到代码存储库(并在文档中向您的贡献添加确认)。

为了理解您的请求,您所说的“序列化”是指添加数据作为附加参数吗?在过去,我经常使用单元格数组"{obj1, obj2, obj3…}"

理查德。

很棒的库,真的很有用。不过我有一个特性请求-添加对Matlab对象序列化的支持。金宝app我修改了代码,以便使用对象调用struct2json,这可以正常工作。我是否可以在任何地方将这些更改贡献回来?

Evgeny

对我的简单任务很有帮助。一个命令就完成了

Evgeny

千千方

这不是真的。支持高维数组。金宝app不支持的是高维单元格数金宝app组。

德米特里•

你不能保存维度大于2的多维数组,对吗?

千千方

你好凯

你可以尝试转换您的输入“审查”(一个字符数组)到unicode首先使用native2unicode()?

不确定它是否有帮助,在jsonlab/sample/demo_jsonlab_basic中的最后一个测试中。m,我有一个utf-8编码的中文字符串。loadjson/savejson似乎在这个例子中工作得很好(我的语言环境是en_US.UTF-8)。

千千方

抱歉,在jsonlab_selftest中没有。而是demo_jsonlab_basic。M

作品伟大的罗马字符。但是,我遇到了一些字符编码问题。我试图阅读脚本类型的语言(阿拉伯语,乌尔都语,达里语,波斯语等)和导入的文本是

{“文本”:“حمایتاتحادیهمیوهفروشانوسبزیفروشانافغانستانازتیماصلاحاتوهمگرایی؛\nحوالی ساعت 8 امشب 27 ماه حوت سال روان…http://t.co/AAcvfHxYAN”、“isoLanguageCode”:“足总"}

结果文本存储在数组中:

ØU…اUŒØªØ§ØªØادUŒ‡U…ŒUˆ‡UØ±UˆØ´Ø§U†ˆØ³Ø¨Ø²UŒØ±UˆØ´Ø§U†Ø§UØºØ§U†Ø³ØªØ§U†Ø§Ø²ØªUŒ…اصU„اØاتUˆ‡U…¯Ø±Ø§UŒŒØ›ØUˆØ§U„ŒØ³Ø§Ø¹Øª8اU…شب27 U…اU‡ØUˆØªØ³Ø§U„رUˆØ§U†……http://t.co/AAcvfHxYAN

我可以得到字符显示正确从一个文本文件,如果:
a.我将本地语言设置为
波斯和阿拉伯语和

b.在fopen期间指定UTF-9编码

>> file = fopen('tweet.txt','r','n','UTF-8');
>> review = fread(file,'*char')';
> >文件关闭(文件);

任何想法吗?

奥古斯汀

一个典型的例子是大型音乐库。话虽如此,这似乎不是这个工具箱的用途。

奥古斯汀

优点:使用方便

缺点:1)糟糕的文档(解析器的选项是什么?)

2)这个工具箱似乎针对大型数组进行了优化,但当字段很小(例如字符串,数值)但json文件仍然很大时,它是不有效的。

艾伯特

非常有用,谢谢。我已经用了几个月了。相当快。

e·l·瑞尔

伟大的工作。像冠军一样执行字符串和结构之间的转换。

千千方

根据错误,听起来您有一个无效的json文件。你用json验证器测试过json文件吗?例如:

http://jsonlint.com/

J

(请删除我之前的问题,我已经找到解决方案了)

输入问题:

Data = loadjson(' Data .json')

我得到错误:

使用loadjson>error_pos错误(第415行)
外层结构必须是对象或数组:/

loadjson错误(第70行)
error_pos('外层结构必须是一个对象或数组');

J

我尝试使用loadjson。m,但我一直在第47行说“输入文件不存在”的错误。我所做的是“data = loadjson('data(5).json')”,该数据文件在同一目录内。请帮助(或重定向到我应该键入我的问题,如果这不是合适的地方)。很多谢谢!

马克Mikofski

@Jan,我一直在使用一个JSON.jar[1],我从java-json源[2],它完美地工作。不过,我不知道本机java的速度与本机MATLAB相比如何。

[1]http://dl.dropbox.com/u/19049582/JSON.jar
[2]http://json.org/java/

利亚

我希望有一个返回数据集的选项。添加了这些行

数据= data.data;
data = struct2cell(数据);
data = cell2mat(挤压(数据)');
数据=数据集({数据(:1),“TimeEPOC”},{数据(:,2),“价值”});

安西Klapuri

更正我之前的帖子:提到的行应该读为“currstr=inStr(pos:min(pos+100,end));”。

安西Klapuri

卓越的贡献。对于大的json文件(我的是>100MB),您可以通过在parse_number()中将“currstr=inStr(pos:end);”替换为“currstr=inStr(pos:pos+100);”来使代码>快100倍。

有用的快速解析器。感谢!

千千方

嗨Chuck37

您报告的问题与loadjson第248行上的cell2mat调用有关。你可以比较以下几点:

=结构(“一个”,“两个”,2);
b = [a];
c = {a};
类(b)
类(c)
类(cell2mat (c))

在许多其他情况下,这种转换是有益的,因为它通过查看内部规律性简化了数据。然而,它确实有你所描述的副作用。

为了解决这个问题,我刚刚提交了SVN#384,接受一个标志来控制单元格数组->结构数组转换,参见

http://iso2mesh.svn.sourceforge.net/viewvc/iso2mesh?view=revision&revision=384

你可以查看这个版本并运行以下程序进行比较:

d = loadjson (savejson (c))
类(d)
d = loadjson (savejson (c),“SimplifyCell”,1)
类(d)

默认情况下,loadjson不再将单元格数组转换为结构数组。

千千方

@Arnout: 2D单元格目前不被jsonlab支持。金宝app我希望在未来的版本中可以添加这一点。欢迎对此作出贡献!

Arnout Standaert

非常感谢JSONLab,它为我编写自己的序列化器节省了很多时间…

一个问题:我注意到2-D单元格字符串数组被压缩成1-D JSON字符串数组。是否可以保持单元格数组的维数?

Chuck37

谢谢你做这个。我遇到的一个问题是,有时阅读器将JSON文件转换为单元格,有时转换为结构。如果我没理解错的话,这是场是否完全相同的函数。对于我的应用程序来说,这是一个真正的痛苦,因为有时字段是无序的(单元格),有时它们不是(数组),我的处理代码不能在没有大量工作的情况下同时工作。有办法让它一直生成细胞吗?我知道这可能没那么快,但我得知道我能得到什么。

Chuck37

乔纳森·李斯特

伟大的工作。对我来说好像很快。我想以人类可读的格式保存结构。起初,我使用XML工具,但发现它们不足。JSON没有XML那么庞大。我喜欢它。

千千方

嗨,马克

我刚刚上传了一个新的JSONLAB版本v0.9.0。除了各种错误修复之外,此版本的主要特性之一是您前面建议的更好的往返一致性。一个前导下划线现在转换为x0x5F_;在savejson中,所有由loadjson生成的十六进制代码都会自动转换回字符串形式。

剩下的一个问题是在matlab中处理多字节字符。如果是这种情况,你可能必须在matlab中运行feature('DefaultCharacterSet','latin1')来获得一致的结果。

如果你对这个新版本感到满意,请告诉我。(下载http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab/Download

千千方

嗨,马克

取出try-catch块可以得到非常详细的输出。对于一个简单的数组输入,输出变成一个单元格数组,每个元素都是一个单元格。它变得非常难以阅读和处理。

我认为我们面临的困难来自于将matlab数据结构映射到JSON时的模糊性。例如,当你说“foo”时,你可以将它映射到“foo”,{"foo"}或["foo"],甚至{["foo"]}。我现在选择了最简单的一个,因为我不知道我们将从括号中获得什么(区分数组原点或单元格原点?)

对于下划线,使用唯一的前缀/后缀似乎是安全的方法。如果我要实现这个功能,我会添加一些像JSONLAB_LEADING_UNDERSCORE_ loadjson/savejson,并使用opt. leadingunderline作为输入选项。

马克

我应该更清楚地回答我的第一个问题:我想要的是savejson将字符串的单元格数组保留为单元格数组(即,在它们周围保留单个括号)。也就是说,我愿意
O.test = {'x'};
s = savejson(",O)
输出:
S = '{"test":["x"]}'

您说过,“loadjson和savejson都被设计为消除默认情况下只有单个元素的JSON数组。”你做这个选择的原因是什么?有没有什么方法可以让我在代码中得到我想要的行为而不出现其他289个问题呢?

另外:我发现,如果我注释掉你在对Nancy (loadjson. exe)的响应中提到的try-catch-end块。m第247-253行),我可以确保括号中的json对象(即使只有一个元素:'["x"]')被解释为单元格数组({'x'})(这是我想要的)。这样做是否会在代码的其他地方给我带来麻烦?

至于下划线——嗯,我在想一个你可以使用的唯一的前缀(或者后置?)在matlab中,两个尾随下划线是合法的(而且不常见)…?)但是如果你不愿意改变两个函数,我可以自己解决这个问题。谢谢!

千千方

嗨,马克

关于你的第一个问题,不,NoRowBracket只适用于“数值元素”。我认为处理字符串数组没有任何问题。

关于你的第二个问题,我可以添加一个非标准的选项来进行转换。但是,目前处理前导下划线的方法是在“x”前面加上一个“x”,类似于MATLAB函数genvarname()的行为。然而,一旦转换,“x_…”形式的名称就很难与真正的名称区分开来。从“x_…”到“_…”的转换可能会出现误报。我不确定这是否是最好的方法,除非我在loadjson中为这个场景定义一个唯一的前缀。

马克

嗨,千千,

感谢出色的代码!

你能澄清一下你对南希上面问题的回答吗?当你写到,

对于savejson,如果您想在单个数值元素周围强制使用[],则有一个标记“NoRowBracket”控件。默认情况下,不打印[]。虽然这没有为字符串数组实现,但类似的行为可能是一致的。

...你的意思是你打算为字符串数组实现NoRowBracket功能吗?(如果是的话,我是否可以鼓励你这样做?)

此外,尽管我理解使用loadjson和savejson实现完全的往返不变性的复杂性,但我想知道你是否能被说服,使一个特殊的往返不变性:

前导的“_”字符通常在python变量中使用,如果你在couchdb中使用json对象,那么“_id”和“_rev”字段名是必要的。是否有任何机会,您可以确保savejson un-did字符串替换,使领先的下划线在loadjson?

千千方

嗨西里尔

谢谢你指出这个错误。我刚刚在SVN中提交了一个修复:

http://iso2mesh.svn.sourceforge.net/viewvc/iso2mesh?view=revision&revision=369

请查看一下。示例的输出为


“测试”:{
“foo”:空,
“酒吧”:0

带有{}或[]的struct元素将被映射为null。

如果这对你有用,请告诉我。

千千

西里尔Davin

嗨,千千,

谢谢你的辛勤工作。
这里有一个小bug:
s.foo = {}; s.bar = 0;savejson(测试,年代)
foo字段和空单元格数组消失。

问候,
西里尔。

马克Mikofski

供您参考:对于那些对使用Java org感兴趣的人。json在MATLAB中

演示:
https://gist.github.com/2492355
git克隆git://gist.github.com/2492355.git orgJSONdemo

Java JSON (org.json):
http://www.json.org/java/index.html

在Matlab中使用Java Collections:
http://undocumentedmatlab.com/blog/using-java-collections-in-matlab/

在Java对象中存储MATLAB结构

Java SE 6 (1.6) API:
http://docs.oracle.com/javase/6/docs/api/

Java HashMap
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

Java数组列表
http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

将数据传递给Java方法:
//www.tatmou.com/help/techdoc/matlab_external/f6425.html

处理从Java方法返回的数据:
//www.tatmou.com/help/techdoc/matlab_external/f6671.html

将Java类和方法引入MATLAB工作区:简化Java类名称:
//www.tatmou.com/help/techdoc/matlab_external/f4863.html#f46341

使用Java数组:
//www.tatmou.com/help/techdoc/matlab_external/f15351.html

连接Java对象:
//www.tatmou.com/help/techdoc/matlab_external/f4873.html#f48488

javaArray:
//www.tatmou.com/help/techdoc/ref/javaarray.html

马克Mikofski

感谢方q的精彩节目。作为替代,任何人都可以使用组织。Json文件直接从java。它们在这里:
https://github.com/douglascrockford/JSON-java
说明在这里:
http://www.json.org/java/index.html
你需要编译它们或者将它们导出到一个需要jdk的jar文件中。我已经在这里为你编译了:
http://dl.dropbox.com/u/19049582/JSON.jar
在使用org。jsonlibrary you have to add to your java class path (either dynamic or static) by following the directions here:
//www.tatmou.com/help/techdoc/matlab_external/f4863.html
例如:javaaddpath('full-path\JSON.jar')会将jar文件添加到动态路径中。
然后你可以使用MATLAB自带的java来使用org。json库。
例如:
jsonObj = org.json.JSONObject('{myKey:myVal}')

千千方

你好,南希

loadjson和savejson都被设计用来消除默认情况下只有一个元素的JSON数组。在loadjson第248行中,调用cell2mat()尝试将1x1单元格数组降级为元素类型的数组(除非有混合类型)。测试类(loadjson('["x"]'))使用和不使用try/catch块,你可以看到区别。

对于savejson,如果您想在单个数值元素周围强制使用[],则有一个标记“NoRowBracket”控件。默认情况下,不打印[]。虽然这没有为字符串数组实现,但类似的行为可能是一致的。

保持往返不变性是不可能的,部分原因是JSON语法有冗余。可以实现的是保留loadjson/loadjson->savejson->loadjson,或者类似地,savejson/savejson->loadjson->savejson,给出类似的答案。但这仍然是一项相当具有挑战性的任务。

千千

南希

嗨,千千,

我注意到,当我在json数组中只有1个值时,往返加载/保存不会给我原始的json字符串(方括号被省略了)。
例子:
>> jsonStr1 = '{"keys": ["value1"]}';
> > savejson(“loadjson (jsonStr1))

ans =


“钥匙”:“value1”

当json数组中有多于1个值时,没有问题。
例子:
>> jsonStr2 = '{"keys": ["value1", "value2"]}';
> > savejson(“loadjson (jsonStr2))

ans =


“钥匙”:(
“value1”,
“value2”

此外,将来是否会有更新来转换由loadjson创建的非法字符替换,当使用savejson?例如,使用savejson时,'_0x2F_'将被转换回'/'。

这太棒了,谢谢!

千千方

你好弗朗索瓦

loadjson和savejson都应该按顺序处理输入项。

对于savejson,我确定数值数组/单元格/单元格数组/字符串数组是由元素索引保存的。

对于结构输入,savejson根据其“定义的”顺序对每个子字段进行编码。这意味着
savejson(“根”,结构体(的f1, f2, 2))
而且
savejson(“根”,结构(f2, 2, f1, 1))

给你不同的输出。如果想以确定的方式排序,可以使用orderfields()函数先处理结构体。

我确实想提一件事,目前jsonlab不能处理高维的单元格/结构数组。基于matlab的列主排序,将其转换为一维数组。例如:
一个=结构(的f1, f2, 2);
= repmat (2, 2);
savejson(”)

我希望在以后的版本中对此进行改进。欢迎对此作出任何贡献!

千千

弗朗索瓦Rongere

很有前途的工作!!
我将尝试在我的研究中实现它,我们有很多异构数据作为我们模拟的参数。

@Fang:我们是否保证json文件中的节点顺序始终相同,以便我可以对json参数文件使用差异和版本控制?

问候

莎莉

0.8.1版本解决了我在2月27日遇到的问题,我更新的json上的括号深度与输入文件中的深度相同。

现在我们可以使用jsonlib来记录图像处理管道中的步骤。谢谢你这么快就调整好了。

千千方

在我看来,这两种情况都没有问题:

> > =结构(“根”,作品结构(“root2”、结构(“root3”,[1 - 2])));
>> works_out = loadjson(savejson(", works));
> > works_out.root.root2.root3

ans =

1
2

> > doesnt_work =结构(“根”,结构(“root2”、结构(“root3”,[1 - 2])));
>> doest_work_out = loadjson(savejson(", doest_work)));
> > doesnt_work_out.root.root2.root3

ans =

1 2

我甚至测试了八度音阶,完全没有问题。你能再次检查并确保你下载了最新版本(0.8.1版本)吗?

奥斯卡

我再次向你道歉。下面是示例应该是怎样的。

工作=结构(“根”,结构(“root2”、结构(“root3”,[1 - 2])));
Works_out = loadjson(savejson(", works));

doest_work = struct('root', struct('root2', struct('root3', [1 2])));
Doesnt_work_out = loadjson(savejson(", doest_work)));

奥斯卡

很抱歉,由于某些原因,我之前的帖子没有出现。是这样的:
工作=结构(“根”,结构(“root2”、结构(“root3”,[1 - 2])));
Works_out = loadjson(savejson(", meta2));

Donesnt_work = struct('root', struct('root2', struct('root3', [1 2])));
Donesnt_work_out = loadjson(savejson(", meta2));

奥斯卡

同样,在这种情况下。输出'works_out'与输入不完全相同。事实上,它已经变成了'doenesnt_work'。

千千方

嗨,奥斯卡

我测试了以下命令,它与当前版本的jsonlab工作良好:

A =struct('f1',[1 2 3 4])
savejson(”)
a2 = loadjson (savejson(”))

我很乐意考虑你的补丁,但如果你能给我你之前失败的测试脚本,这将是非常有帮助的。

奥斯卡

嗨,千千,

我发现了问题所在。如果结构体包含行向量,则它们不会被正确编码。我将这些简单的行添加到mat2json子函数中,将行向量转换为列向量,现在它就像一个魅力。

If ((size(item, 1) == 1) && size(item, 2) > 1)
Item = Item ';
结束

谢谢

千千方

嗨,奥斯卡

请张贴您的示例脚本和数据,以便我们可以调试。

千千

奥斯卡

根据我的经验,这并不适用于所有类型的对象,而且值得注意的是,我无法用“savejson”创建的“loadjson”加载输出json结构。我想知道是否有一个json matlab - struct接口的基本问题/歧义?

千千方

你好Sally,我刚刚更新了jsonlab到0.8.1。这个版本的一个变化是避免在savejson.m中强制使用“根”对象。为此,你需要使用savejson(",obj)来保存你的结构。

所以,下载新版本并尝试一下吧。如果这是你想要的,请告诉我。

莎莉

我的json在每次loadjson/savejson往返中获得一组额外的花括号。这个效果显示在你漂亮页面上的每个例子中:http://iso2mesh.sourceforge.net/cgi-bin/index.cgi?jsonlab/Doc/Examples

有办法避免这种情况吗?我想使用matlab向现有的json文件添加一个元素,而不是在结果文件中嵌套更深的内容。

谢谢你,莎莉

1月

@Fang:(我希望这是你的第一个名字)谢谢你的回答。我将尽快测试我的建议的速度改进。
以0开头的当前版本号表示计划进行进一步的开发。我希望,这最终会是一个5星的提交。

千千方

你好,简

谢谢你的意见。你在loadjson中指出的问题。m在很大程度上继承了以前作者的版本(OCTAVE_VERSION除外)。我将考虑你的意见,并在未来提高加载速度。也欢迎您提交补丁和分析结果来帮助我。

还有,请转到http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab/Download下载昨天发布的0.5.1版本。我意识到我在0.5.0中犯了一个错误,我在加载大数据方面的优化代码没有启用。使用新的代码,从JSON文件加载一个大型矩阵可以快30倍(通过在parse_array中传递parse_number调用)。

希望0.5.1版本很快会在Matlab文件交换上更新。

1月

过度使用全局变量会显著降低速度,并可能干扰其他程序。
exist('OCTAVE_VERSION', 'builtin')是一个更好的测试,因为它不搜索文件"OCTAVE_VERSION. exe "。m”在完整的Matlab路径中。
通过预分配,代码可以大大加快。动态字段名比GETFIELD快。STRMATCH非常慢,已弃用。
“eval (sprintf(对象。%s = val;', valid_field(str)))”是残酷的。更好的方法:"object.(valid_field(str)) = val"。
MLint建议省略一些查找。
这个函数非常有用,因为JSON文件对于特定类型的数据非常有效。如果速度进一步提高,这是一个非常好的提交。