MATLAB Answers


Why does jsonencode parser does not remove exponential notations when format longG is used?

Asked by Kiran Prakash on 17 Sep 2019
Latest activity Commented on by Kiran Prakash on 17 Sep 2019
I would like to save a structured data in a JSON file. There are various structured array elements that has integer number that needs to be represented without any exponents in the notation.
The following is an example commands that formats correctly as per my requirement on command window. But formats with exponent notation after saving to a json file.
% Command Window output
>> clear all
>> format long g
>> university.department.EEE.studentID = {122323259857567}
university =
struct with fields:
department: [1x1 struct]
>> university.department.EEE.studentID
ans =
1x1 cell array
% When I write it to JSON File the cell array now saves the above studentID with exponents
>>jsonData = jsonencode(university);
saveFileName = [filePath, '/', 'student1.json'];
fileId = fopen(saveFileName, 'w');
if fileId== -1, error('Cannot create JSON file');end
fwrite(fileId, jsonData, 'char');
% student1.json now has :
% {
% "department":
% "EEE": {
% studentID: {[1.223232598575670e+14]}
% studentName: "XYZ YUI"
% }
% "ECE":{
% studentID: {[1.223232598575670e+14]}
% studentName: "sdf YUI"
% }
% "CS":{
% studentID: {[1.223232598575670e+14]}
% studentName: "ABC YUI"
% }
% }


Sign in to comment.

1 Answer

Answer by Guillaume
on 17 Sep 2019
Edited by Guillaume
on 17 Sep 2019
 Accepted Answer

The straightforward answer to your question is simple. format has nothing to do with jsonencode, it only affects display at the matlab command prompt. I'm not sure why you thought it would affect jsonencode. Nowhere does it say that.
As for your problem, the json specs does not specify how numbers should be encoded as text in the json, so matlab is perfectly within its right to encode the way it does. Note that 122323259857567 and 1.223232598575670e+14 are exactly the same number, so a conformant decoder that can decode numbers of that magnitude (not guaranteed but very likely) will decode them properly.
Now, there is a way to force matlab to write integers less than 18446744073709551615 without using scientific notation by converting them to uint64, but again, there is nothing wrong with the way matlab currently encodes the numbers.
>> university.department.EEE.studentID = uint64(122323259857567); %not sure why you were using a cell array
>> jsonencode(university)
ans =

  1 Comment

uint64() was exactly what I was looking for.
Thanks for taking time to explain. That was helpful. By the way, I am using it in a cell array as because I have multiple IDs associated to the same student and I am storing them as array of ints.
I would be interested to know how a conformant decoder would read it. I will update here if it doesn't read correctly here.
Thanks again.

Sign in to comment.