Hi,
I'm following the example on how to handle JSON responses in QActions but have got stuck when passing the data to a paramID. I have the connector with my JSON response being passed to param 22. I then want to add the data to rows in table 2200. I'm using JsonConvert.DeserializeObject to deserialise to a root object. The trouble I have is how to get each row in the table populated by the deserialised JSON. In the example there's a using statement in the QAction that refers to another QAction but it isn't explained what the other QAction is doing so I'm not sure how to use it in my example. There's also a method calling xxxQActionRow which then isn't working.
I've generated the classes using the paste special feature in Visual Studio, I just am stuck with the foreach command getting the data to the table parameter.
My QAction is as follows;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Skyline.DataMiner.Scripting;
using Newtonsoft.Json;
/// <summary>
/// DataMiner QAction Class: deserialise.
/// </summary>
public static class QAction
{
public class Rootobject
{
//public int count { get; set; }
public Port[] Ports { get; set; }
}
public class Port
{
public string ifname { get; set; }
public string ip { get; set; }
public string name { get; set; }
public int id { get; set; }
public string mac { get; set; }
}
/// <summary>
/// The QAction entry point.
/// </summary>
/// <param name="protocol">Link with SLProtocol process.</param>
public static void Run(SLProtocol protocol)
{
try
{
//get json string
string source = Convert.ToString(protocol.GetParameter(Parameter.responsecontent_22));
//deserialise contents
Rootobject rootObject = JsonConvert.DeserializeObject<Rootobject>(source);
List<object[]> portsList = new List<object[]>();
//convert classes into rows
//rootObject.count = responseCount;
foreach (Port port in rootObject.Ports)
{
//portsList.Add(new PortQActionRow)
//string interfaceName = port.ifname;
//engine.generateInformation(interfaceName);
//protocol.SetParameter(Parameter.responsecount_23)
}
}
catch (Exception ex)
{
protocol.Log("QA" + protocol.QActionID + "|" + protocol.GetTriggerParameter() + "|Run|Exception thrown:" + Environment.NewLine + ex, LogType.Error, LogLevel.NoLogging);
}
}
}
Hi Ross,
you could do something like this:
List<object[]> rows = new List<object[]>();
foreach(Port port in rootobject.ports)
{
object[] row = new object[5];
row[0] = port.ifname;
//assign all columns here
rows.Add(row);
}
protocol.FillArray(tablePid, rows, NotifyProtocol.SaveOption.Partial);
Perfect – Thanks a lot, very much appreciated!
Hi, I’ve been doing some testing outside of the QAction in an automation script. The output of the below is an info event for each instance of ifName, name, mac etc of the table Ports. So it’s working as expected. All I need is the method to get the data values into the parameters of my table.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Skyline.DataMiner.Automation;
//using Skyline.DataMiner.Scripting;
using Newtonsoft.Json;
public class Rootobject
{
public int count { get; set; }
public Port[] ports { get; set; }
}
public class Port
{
public string ifname { get; set; }
public string ip { get; set; }
public string name { get; set; }
public int id { get; set; }
public string mac { get; set; }
}
public class Script
{
public void Run(Engine engine)
{
Element chassis = engine.FindElement(“RossTest”);
string source = Convert.ToString(chassis.GetParameter(22));
Rootobject rootobject = JsonConvert.DeserializeObject(source);
foreach (Port port in rootobject.ports)
{
engine.GenerateInformation(port.ifname);
engine.GenerateInformation(port.ip);
engine.GenerateInformation(port.name);
engine.GenerateInformation(port.mac);
//engine.GenerateInformation(port.id);
};
//protcol
}
}