Hello Dataminer team,
I'm having trouble to pass data from a array, derived from deserialised JSON, to a table. I've followed the example in the Dev Guide (How to handle XML and JSON data in QActions) however, like another user in the community, could not make it work. The data is being deserialized correctly however it's passing this to a table where I'm struggling. I've tried to follow some other examples in the online material without success. Are you able to assist please?
In this example I have a simple JSON array containing the metrics of a fan inside a device, here's a sample of the values from one fan.
[{"name": "Fan1A", "rawValue": "6480 RPM", "unit": "rpm", "speed": 6480.0}]And, here's my QAction code.
-----------------------------------
using System;
using System.Collections.Generic;
using Skyline.DataMiner.Scripting;
using Newtonsoft.Json;
// <summary>
// The QAction entry point.
// </summary>
// <param name="protocol">Link with SLProtocol process.</param>
public static class QAction
{
public class rootObject
{
public string name { get; set; }
public string rawValue { get; set; }
public string unit { get; set; }
public float speed { get; set; }
}
public static void Run(SLProtocol protocol)
{
try
{
//get json string
string source = Convert.ToString(protocol.GetParameter(11));
//deserialise contents
List<rootObject> fansList = JsonConvert.DeserializeObject<List<rootObject>>(source);
int tableID = 1000;
List<string> names = new List<string>();
List<float> speeds = new List<float>();
List<object[]> rows = new List<object[]>();
int i;
for(i = 0; i < fansList.Count; i++)
{
object[] row = new object[2];
names.Add(fansList[i].name);
speeds.Add(fansList[i].speed);
//assign all columns here
rows.Add(row);
}
object[] tableContent = new object[] { names, speeds };
protocol.NotifyProtocol(193/*NT_FILL_ARRAY*/ , tableID, tableContent);
}
catch (Exception ex)
{
protocol.Log("QA" + protocol.QActionID + "|" + protocol.GetTriggerParameter() + "|Run|Exception thrown:" + Environment.NewLine + ex, LogType.Error, LogLevel.NoLogging);
}
}
}
Hi Wade,
The FillArray call is very particular about the type of the columns.
The columns should always be an object[] instead of a List<T>.
You can rewrite the code to something like this:
//get json string
string source = Convert.ToString(protocol.GetParameter(11));
//deserialise contents
List<rootObject> fansList = JsonConvert.DeserializeObject<List<rootObject>>(source);
int tableID = 1000;
object[] nameColumn = new object[fansList.Count];
object[] speedColumn = new object[fansList.Count];
for (int i = 0; i < fansList.Count; i++)
{
nameColumn[i] = fansList[i].name;
speedColumn[i] = fansList[i].speed;
}
object[] columns = new object[] { nameColumn, speedColumn };
protocol.FillArray(tableID, columns);
I also recommend using the protocol.FillArray method instead of the NotifyProtocol to make the code a little bit more readable.
Hi Thomas, many thanks for your speedy and helpful reply. Thanks also for the explanation about the use of the FillArray, it’s much appreciated.