https://stackoverflow.com/questions/53936668

CSharp · Console

/Program.cs

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 {}
}
;