using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class ItemAttribute
public string AttibuteName { get; set; }
public string AttributeValue { get; set; }
public string SONumber { get; set; }
public int LineNum { get; set; }
public string ItemId { get; set; }
public List<ItemAttribute> ItemAttributes { get; set; }
public string documentType { get; set; }
public string SONumber { get; set; }
[JsonConverter(typeof(EmbeddedLiteralConverter<List<SalesLine>>))]
public List<SalesLine> SalesLines { get; set; }
public List<Value> value { get; set; }
public class EmbeddedLiteralConverter<T> : JsonConverter
public override bool CanConvert(Type objectType)
return typeof(T).IsAssignableFrom(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
var contract = serializer.ContractResolver.ResolveContract(objectType);
if (contract is JsonPrimitiveContract)
throw new JsonSerializationException("Invalid type: " + objectType);
if (existingValue == null)
existingValue = contract.DefaultCreator();
if (reader.TokenType == JsonToken.String)
var json = (string)JToken.Load(reader);
using (var subReader = new JsonTextReader(new StringReader(json)))
serializer.Populate(subReader, existingValue);
serializer.Populate(reader, existingValue);
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public static void Test()
static void TestConverter()
var jsonString = GetJson();
var root = JsonConvert.DeserializeObject<RootObject>(jsonString);
var json2 = JsonConvert.SerializeObject(root, Formatting.Indented);
Console.WriteLine("\nDeserialized and re-serialized {0}", root);
Console.WriteLine(json2);
public static void ShowUnescapedJson()
Console.WriteLine("\nUnescaped JSON: ");
var jsonString = GetJson();
var json = JToken.Parse(jsonString);
foreach(var token in json.SelectTokens("value[*].SalesLines").ToList())
token.Replace(JToken.Parse((string)token));
""documentType"":""Quote"",
""SONumber"":""S-QUO1001"",
""SalesLines"":""[{\""SONumber\"":\""S-QUO1001\"",\""LineNum\"":10000,\""ItemId\"":\""1936-S\"",\""ItemAttributes\"":[{\""AttibuteName\"":\""COLOR\"",\""AttributeValue\"":\""YELLOW\""},{\""AttibuteName\"":\""DEPTH\"",\""AttributeValue\"":\""100\""},{\""AttibuteName\"":\""WIDTH\"",\""AttributeValue\"":\""120\""},{\""AttibuteName\"":\""HEIGHT\"",\""AttributeValue\"":\""115\""},{\""AttibuteName\"":\""MATERIAL DESCRIPTION\"",\""AttributeValue\"":\""COTTON, WOOD LEGS\""},{\""AttibuteName\"":\""MODEL YEAR\"",\""AttributeValue\"":\""1940\""}]}]""
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");