我正在尝试读取.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"}"
答案 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文本必须是字符向量或标量非缺失字符串。