CSharp · Console
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
string responseData = @"
{
""DocumentException"": null,
""Success"": true,
""TimestampExtraInfoPackages"": [
{
""Area "": ""AA"",
""Company"": ""XXX"",
""ContactID"": ""123"",
""PackageID"": ""P1"",
""Timestamp"": ""20090501163433360001"",
""ExtraInfo"": [
{
""Key"": ""Key1"",
""Value"": ""value1""
},
{
""Key"": ""Key2"",
""Value"": ""value2""
}
]
}
],
""TimestampPackages"": []
}";
GetAllUnprintedItemsResponse upResponse = new GetAllUnprintedItemsResponse();
JsonConvert.PopulateObject(responseData, upResponse);
foreach (var kvp in upResponse.TimestampExtraInfoPackages.First().ExtraInfo)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
}
}
public class KvpArrayToDictionaryConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IDictionary<string, string>).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var dict = new Dictionary<string, string>();
var array = JArray.Load(reader);
foreach (var obj in array.Children<JObject>())
{
dict.Add((string)obj["Key"], (string)obj["Value"]);
}
return dict;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
[DataContract]
public class TimestampPackageDC
{
[DataMember]
public string Timestamp { get; set; }
[DataMember]
public string Company { get; set; }
[DataMember]
public string ContactID { get; set; }
[DataMember]
public string Area { get; set; }
[DataMember]
public string PackageID { get; set; }
} // end of class TimestampPackageDC
[DataContract]
public class TimestampPackageExtraDC : TimestampPackageDC
{
[DataMember]
[JsonConverter(typeof(KvpArrayToDictionaryConverter))]
public IDictionary<string, string> ExtraInfo { get; set; }
} // end of class TimestampPackageExtraDC
[DataContract]
public class GetAllUnprintedItemsResponse //: BaseResponse
{
[DataMember]
public TimestampPackageDC[] TimestampPackages { get; set; }
[DataMember]
public TimestampPackageExtraDC[] TimestampExtraInfoPackages { get; set; }
}
// DotNetFiddle doesn't seem to have support for [DataContract] or [DataMember] so I'm faking them out here.
// You should not need this in production code; instead add a reference to the System.Runtime.Serialization assembly
namespace System.Runtime.Serialization
{
public class DataContractAttribute : Attribute {}
public class DataMemberAttribute: Attribute {}
}