Не удается декодировать строку JSON - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь прочитать файл .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 голосов
/ 07 ноября 2018

Я не могу воспроизвести вашу проблему:

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, вы можете сэкономить некоторые усилия, работая с массивами строк :

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 >
0 голосов
/ 31 января 2019

Я думаю, что 2018b представил ошибку в jsondecode. Тестовый файл, содержащий только этот текст (взят из документации jsondecode):

{ "идентификаторы": [116,943,234,38793]}

(с переводом строки в конце файла) правильно декодируется с помощью jsondecode, поставляемого с Matlab 2018a, но версия в 2018b печатает ошибку

Ошибка при использовании jsondecode Текст JSON должен быть символьным вектором или скалярной не пропущенной строкой.

0 голосов
/ 07 ноября 2018

Код правильный, необходимо внести незначительные изменения.

В вызове cellfun вы должны изменить диапазон векторов символов, чтобы включить открывающую скобку {. Предполагается, что расположение скобки зафиксировано в вашем текстовом файле.

Вы также должны раскрыть текст при вызове функции cellfun.

Пример файла журнала:

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'
...