Convert Json cells/struct to table

조회 수: 8 (최근 30일)
Dion Theunissen
Dion Theunissen 2022년 5월 10일
답변: Ravi 2023년 10월 5일
I have an API request and want to convert in in a table.
The response is a cell build out of structs. Every row in de cell needs to be a row in the table. The structs are build out of charts, doubles and structs again. Now i made the following but it looks like this is not the right and quickest way. I fill the RawDataAPI (empty table) by getting every value one by one.
for i2 = 1:size(response3)
RawDataAPI.triggerType(i2) = string(response3{i2, 1}.triggerType);
RawDataAPI.vehicleIdentificationNumber(i2) = string(response3{i2, 1}.vehicleIdentificationNumber);
RawDataAPI.UniekId(i2) = string(response3{i2, 1}.driverIdentification);
RawDataAPI.createdTimestamp(i2) = string(response3{i2, 1}.createdTimestamp);
RawDataAPI.receivedTimestamp(i2) = string(response3{i2, 1}.receivedTimestamp);
RawDataAPI.distance(i2) = (response3{i2, 1}.distance);
RawDataAPI.distanceCruiseControl(i2) = (response3{i2, 1}.distanceCruiseControl);
RawDataAPI.weight(i2) = (response3{i2, 1}.weight);
RawDataAPI.fuelUsed(i2) = (response3{i2, 1}.fuelUsed);
RawDataAPI.fuelUsedSpeedZero(i2) = (response3{i2, 1}.fuelUsedSpeedZero);
RawDataAPI.fuelUsedPto(i2) = (response3{i2, 1}.fuelUsedPto);
RawDataAPI.durationUsedPto(i2) = (response3{i2, 1}.durationPto);
RawDataAPI.durationSpeedOverZero(i2) = (response3{i2, 1}.durationSpeedOverZero);
RawDataAPI.durationSpeedZero(i2) = (response3{i2, 1}.durationSpeedZero);
RawDataAPI.distanceCoasting(i2) = (response3{i2, 1}.distanceCoasting);
RawDataAPI.durationCruiseControl(i2) = (response3{i2, 1}.durationCruiseControl);
RawDataAPI.brakeCounter(i2) = (response3{i2, 1}.brakeCounter);
RawDataAPI.latitude(i2) = (response3{i2, 1}.latitude);
RawDataAPI.longitude(i2) = (response3{i2, 1}.longitude);
RawDataAPI.altitude(i2) = (response3{i2, 1}.altitude);
RawDataAPI.Acc03(i2) = [response3{i2, 1}.acceleration(1).value].';
RawDataAPI.Acc05(i2) = [response3{i2, 1}.acceleration(2).value].';
RawDataAPI.Acc07(i2) = [response3{i2, 1}.acceleration(3).value].';
RawDataAPI.Acc09(i2) = [response3{i2, 1}.acceleration(4).value].';
RawDataAPI.Acc11(i2) = [response3{i2, 1}.acceleration(5).value].';
RawDataAPI.Acc15(i2) = [response3{i2, 1}.acceleration(6).value].';
RawDataAPI.Acc2(i2) = [response3{i2, 1}.acceleration(7).value].';
RawDataAPI.Acc25(i2) = [response3{i2, 1}.acceleration(8).value].';
RawDataAPI.Acc3(i2) = [response3{i2, 1}.acceleration(9).value].';
RawDataAPI.Acc35(i2) = [response3{i2, 1}.acceleration(10).value].';
RawDataAPI.Acc4(i2) = [response3{i2, 1}.acceleration(11).value].';
RawDataAPI.Brake03(i2) = [response3{i2, 1}.brake(1).value].';
RawDataAPI.Brake05(i2) = [response3{i2, 1}.brake(2).value].';
RawDataAPI.Brake07(i2) = [response3{i2, 1}.brake(3).value].';
RawDataAPI.Brake09(i2) = [response3{i2, 1}.brake(4).value].';
RawDataAPI.Brake11(i2) = [response3{i2, 1}.brake(5).value].';
RawDataAPI.Brake15(i2) = [response3{i2, 1}.brake(6).value].';
RawDataAPI.Brake2(i2) = [response3{i2, 1}.brake(7).value].';
RawDataAPI.Brake25(i2) = [response3{i2, 1}.brake(8).value].';
RawDataAPI.Brake3(i2) = [response3{i2, 1}.brake(9).value].';
RawDataAPI.Brake35(i2) = [response3{i2, 1}.brake(10).value].';
RawDataAPI.Brake4(i2) = [response3{i2, 1}.brake(11).value].';
RawDataAPI.Torque1(i2) = [response3{i2, 1}.torque(1).value].';
RawDataAPI.Torque2(i2) = [response3{i2, 1}.torque(2).value].';
RawDataAPI.Torque3(i2) = [response3{i2, 1}.torque(3).value].';
RawDataAPI.Torque4(i2) = [response3{i2, 1}.torque(4).value].';
RawDataAPI.Torque5(i2) = [response3{i2, 1}.torque(5).value].';
RawDataAPI.Torque6(i2) = [response3{i2, 1}.torque(6).value].';
RawDataAPI.Torque7(i2) = [response3{i2, 1}.torque(7).value].';
RawDataAPI.Torque8(i2) = [response3{i2, 1}.torque(8).value].';
RawDataAPI.Torque9(i2) = [response3{i2, 1}.torque(9).value].';
RawDataAPI.Torque10(i2) = [response3{i2, 1}.torque(10).value].';
RawDataAPI.Speed1(i2) = [response3{i2, 1}.speed(1).value].';
RawDataAPI.Speed2(i2) = [response3{i2, 1}.speed(2).value].';
RawDataAPI.Speed3(i2) = [response3{i2, 1}.speed(3).value].';
RawDataAPI.Speed4(i2) = [response3{i2, 1}.speed(4).value].';
end

답변 (1개)

Ravi
Ravi 2023년 10월 5일
Hi Dion Theunissen,
According to my understanding, you want to shorten your code avoiding writing redundant statements.
You can use the “eval function for this purpose. This can be broken down into few steps.
  • Find the properties that are present in the struct using “fieldnames function and store them in an array.
  • Since, now you have the field names. You can access the field by writing an expression in the eval function.
myCourse = struct("coursename", "MATLAB", "number_of_students", 100, "duration", "6 weeks");
required = 'duration';
ans = eval(['myCourse.', char(required)]);
disp(ans);
The eval function here evaulates the expression, “myCourse.duration” and stores that answer in “ans” variable.
  • Loop over the field names and assign them to the corresponding table variable name.
% triggerType
var = 'triggerType';
eval(["RawDataAPI.", char(var), "(i) = string(response3(", num2str(i), ".", char(var)]);
% torque
for j=1:10
eval(["RawDataAPI.Torque", num2str(j), "(", num2str(i), ") = [response3{", num2str(i), ", 1}.torque(", num2str(j), ").value"]);
end
Though this helps you shorten your code a bit, yet there are some statements that you need to write manually because there is no pattern in the variable names of the table, for example “Acc”, “Brake”.
For more understanding about the eval function kindly refer to the below provided links.
Hope this helps.

카테고리

Help CenterFile Exchange에서 Data Type Identification에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by