The request follows through, but the resulting class I defined as a part of
var result = Client.Get<Collection<Server>>(resource);
seems to have issues decoding, but I thought I was doing it correctly.
Newtonsoft.Json.JsonSerializationException HResult=0x80131500
Message=Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.Dictionary`2[System.String,System.Object]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. Path '', line 1, position 1.
So I defined the class "Server" as follows:
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "9.13.15.0 (Newtonsoft.Json v11.0.0.0)")]
public class Server
{
[Newtonsoft.Json.JsonProperty("ConfigTimeStamp", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public DateTime ConfigTimeStamp { get; set; }
[Newtonsoft.Json.JsonProperty("DisconnectedReason", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string DisconnectedReason { get; set; }
[Newtonsoft.Json.JsonProperty("JsonProperty", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public bool IsActive { get; set; }
[Newtonsoft.Json.JsonProperty("IsConfigDeferred", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public bool IsConfigDeferred { get; set; }
[Newtonsoft.Json.JsonProperty("LastConnected", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public DateTime LastConnected { get; set; }
[Newtonsoft.Json.JsonProperty("OsVersion", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string OsVersion { get; set; }
[Newtonsoft.Json.JsonProperty("PServiceStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public ICollection<ServiceStatus> PServiceStatus { get; set; }
[Newtonsoft.Json.JsonProperty("ProductVersion", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string ProductVersion { get; set; }
[Newtonsoft.Json.JsonProperty("ServerDescription", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string ServerDescription { get; set; }
[Newtonsoft.Json.JsonProperty("ServerId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public int ServerId { get; set; }
[Newtonsoft.Json.JsonProperty("ServerLocation", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string ServerLocation { get; set; }
[Newtonsoft.Json.JsonProperty("ServerName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string ServerName { get; set; }
[Newtonsoft.Json.JsonProperty("TimeZoneName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string TimeZoneName { get; set; }
[Newtonsoft.Json.JsonProperty("TimeZoneOffset", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public int TimeZoneOffset { get; set; }
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "9.13.15.0 (Newtonsoft.Json v11.0.0.0)")]
public class ServiceStatus
{
[Newtonsoft.Json.JsonProperty("Description", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Description { get; set; }
[Newtonsoft.Json.JsonProperty("LastError", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string LastError { get; set; }
[Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Name { get; set; }
[Newtonsoft.Json.JsonProperty("ServiceId", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public int ServiceId { get; set; }
[Newtonsoft.Json.JsonProperty("State", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public int State { get; set; }
}
Essentially, I thought that I needed to define a JsonProperty with the same KEY as the property it is being assigned to, because the fetched markup would be returning similar.
Here is my sample returned payload:
"[{\"configTimeStamp\":1548894763,\"disconnectedReason\":\"RPC call timed-out\",\"isActive\":true,\"isConfigDeferred\":false,\"lastConnected\":1549644602,\"osVersion\":\"Windows Server 2016 Datacenter \",\"pServiceStatus\":[{\"description\":\"Trustwave SEG Receiver.\\nAccepts email messages for processing.\",\"lastError\":null,\"name\":\"Receiver\",\"serviceId\":0,\"state\":0},{\"description\":\"Trustwave SEG Content Engine.\\nApplies your email policy to messages.\",\"lastError\":null,\"name\":\"Engine\",\"serviceId\":1,\"state\":0},{\"description\":\"Trustwave SEG Sender.\\nForwards processed messages for delivery.\",\"lastError\":null,\"name\":\"Sender\",\"serviceId\":2,\"state\":0},{\"description\":\"Trustwave SEG POP3 Server.\\nDelivers email messages to POP3 users.\",\"lastError\":null,\"name\":\"Pop3\",\"serviceId\":3,\"state\":0}],\"productVersion\":\"8.2.1.11863\",\"serverDescription\":\"\",\"serverId\":1,\"serverLocation\":\"\",\"serverName\":\"win2016-seg\",\"timeZoneName\":\"Coordinated Universal Time\",\"timeZoneOffset\":0}]"
I made the classes purely for this payload, so they are open to be changed, I'm just not sure whats going on here. It seemed like it should have worked correctly.
You can't convert a Unix-Timestamp to a DateTime without using a Converter.
I decorated the DateTime properties with [JsonConverter(typeof(UnixDateTimeConverter))]
and the Deserialization worked just fine:
var payload = "[{\"configTimeStamp\":1548894763,\"disconnectedReason\":\"RPC call timed-out\",\"isActive\":true,\"isConfigDeferred\":false,\"lastConnected\":1549644602,\"osVersion\":\"Windows Server 2016 Datacenter \",\"pServiceStatus\":[{\"description\":\"Trustwave SEG Receiver.\\nAccepts email messages for processing.\",\"lastError\":null,\"name\":\"Receiver\",\"serviceId\":0,\"state\":0},{\"description\":\"Trustwave SEG Content Engine.\\nApplies your email policy to messages.\",\"lastError\":null,\"name\":\"Engine\",\"serviceId\":1,\"state\":0},{\"description\":\"Trustwave SEG Sender.\\nForwards processed messages for delivery.\",\"lastError\":null,\"name\":\"Sender\",\"serviceId\":2,\"state\":0},{\"description\":\"Trustwave SEG POP3 Server.\\nDelivers email messages to POP3 users.\",\"lastError\":null,\"name\":\"Pop3\",\"serviceId\":3,\"state\":0}],\"productVersion\":\"8.2.1.11863\",\"serverDescription\":\"\",\"serverId\":1,\"serverLocation\":\"\",\"serverName\":\"win2016-seg\",\"timeZoneName\":\"Coordinated Universal Time\",\"timeZoneOffset\":0}]";
var servers = JsonConvert.DeserializeObject<Collection<Server>>(payload);
public class Server
{
[JsonProperty("ConfigTimeStamp", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(UnixDateTimeConverter))]
public DateTime ConfigTimeStamp { get; set; }
[JsonProperty("DisconnectedReason", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string DisconnectedReason { get; set; }
[JsonProperty("JsonProperty", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public bool IsActive { get; set; }
[JsonProperty("IsConfigDeferred", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public bool IsConfigDeferred { get; set; }
[JsonProperty("LastConnected", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(UnixDateTimeConverter))]
public DateTime LastConnected { get; set; }
[JsonProperty("OsVersion", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string OsVersion { get; set; }
[JsonProperty("PServiceStatus", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public ICollection<ServiceStatus> PServiceStatus { get; set; }
[JsonProperty("ProductVersion", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string ProductVersion { get; set; }
[JsonProperty("ServerDescription", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string ServerDescription { get; set; }
[JsonProperty("ServerId", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int ServerId { get; set; }
[JsonProperty("ServerLocation", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string ServerLocation { get; set; }
[JsonProperty("ServerName", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string ServerName { get; set; }
[JsonProperty("TimeZoneName", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string TimeZoneName { get; set; }
[JsonProperty("TimeZoneOffset", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int TimeZoneOffset { get; set; }
}
public class ServiceStatus
{
[JsonProperty("Description", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string Description { get; set; }
[JsonProperty("LastError", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string LastError { get; set; }
[JsonProperty("Name", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty("ServiceId", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int ServiceId { get; set; }
[JsonProperty("State", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int State { get; set; }
}
But maybe your Client
handles Deserialization differently, so if this doesn't fix your problem, evaluating on what your Client
is would probably be beneficial.
User contributions licensed under CC BY-SA 3.0