无法解码JSON字符串

时间:2018-11-07 09:15:09

标签: json string matlab parsing file-io

我正在尝试读取.log文件并获取信息,这些信息将在以后用于创建图形。

%Open text file
fileID  = fopen('file.log');

text = textscan(fileID, '%s', 'delimiter','\n','whitespace','');

json_text=cellfun(@(x) x(53:end-1),text, 'UniformOutput',false);

%Decode in json
data=cellfun(@jsondecode,json_text,'UniformOutput',false);

我遇到以下错误:

Error using jsondecode
JSON text must be a character vector or a scalar non-missing string.

对我来说,这似乎是一个很简单的问题,但我尝试用Google搜索它,但找不到任何解决方案。

我已经测试了前三个命令是否正常工作(例如,没有解码为json部分)并且它是否工作。所以问题是当我尝试将数据解码为json时。
任何提示可能是什么问题吗?

下面是.log文件中的示例行:

123456.99 :: working completed: result=0 , data ="{"day":"monday", "breakfast":"sandwich"}"

3 个答案:

答案 0 :(得分:1)

该代码是正确的,只需要进行少量更改。

cellfun调用中,您应该更改字符向量范围,以包含左括号 {。这确实假定了括号在整个文本文件中的位置是固定的。

调用cellfun函数时,还应该展开 text

示例日志文件:

123456.99 :: working completed: result=0 , data ="{"day":"monday", "breakfast":"sandwich"}"
123456.99 :: working completed: result=0 , data ="{"day":"tuesday", "breakfast":"bread"}"

代码段:

% Open text file.
fileID  = fopen('file.log');

text = textscan(fileID, '%s', 'delimiter','\n','whitespace','');

json_text=cellfun(@(x) x(51:end-1),text{:}, 'UniformOutput',false);

% Decode in json.
data=cellfun(@jsondecode,json_text,'UniformOutput',false);

% Close text file.
fclose(fileID);

结果:

>> data{:}

ans = 

  struct with fields:

          day: 'monday'
    breakfast: 'sandwich'


ans = 

  struct with fields:

          day: 'tuesday'
    breakfast: 'bread'

答案 1 :(得分:1)

我无法重现您的问题:

json_text = {'{"day":"monday", "breakfast":"sandwich"}'}
data = cellfun(@jsondecode, json_text,'UniformOutput', false);
%{
>> data{1}
ans = 
  struct with fields:

          day: 'monday'
    breakfast: 'sandwich'    
%}

但是我确实遇到了另一个主要与在预定位置53处切割字符串有关的问题。最好在字符串data =之后剪切日志行,而不要依赖于预定义的位置(由于日志文件结构的不可预见的变化,该位置可能会改变)。

由于您使用的是最新版本的MATLAB,因此可以通过使用String arrays来节省一些精力:

strLog = string(text); % This turns the cell array into a vector of string objects
res = split(strLog, "data ="); % You should end up with two columns for non-scalar input.
json_str = res(:, 2);
% < You can take it from here >

答案 2 :(得分:0)

我认为2018b在jsondecode中引入了一个错误。仅包含此文本的测试文件(直接取自jsondecode的文档):

{ “标识”:[116,943,234,38793]}

(具有在文件的结尾换行)被正确地由用Matlab 2018A附带的jsondecode,但版本中2018B打印的错误解码

使用jsondecode错误  JSON文本必须是字符向量或标量非缺失字符串。