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 object RNumber { get; set; }
public string BRNumber { get; set; }
[JsonProperty("@paraID")]
public string paraID { get; set; }
public string Value { get; set; }
public string label { get; set; }
public List<Number> number { get; set; }
public Evaluation evaluation { get; set; }
public DateTime DateTime = DateTime.UtcNow;
public string PossibleNull = null;
public class OnlineFields
public string CCode { get; set; }
public string MNumber { get; set; }
public string Product { get; set; }
[JsonConverter(typeof(EmbeddedLiteralConverter<JsonFile>))]
public JsonFile JsonFile { get; set; }
public object Message { get; set; }
public bool Error { get; set; }
public VData VData { get; set; }
public OnlineFields onlineFields { get; set; }
public DateTime DateTime = DateTime.UtcNow;
public string PossibleNull = null;
public class EmbeddedLiteralConverter<T> : JsonConverter
public override bool CanConvert(Type objectType)
return typeof(T).IsAssignableFrom(objectType);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
using (new PushValue<bool>(true, () => Disabled, (canWrite) => Disabled = canWrite))
using (var sw = new StringWriter(writer.Culture))
using (var nestedWriter = new JsonTextWriter(sw)
DateFormatHandling = writer.DateFormatHandling,
DateFormatString = writer.DateFormatString,
DateTimeZoneHandling = writer.DateTimeZoneHandling,
StringEscapeHandling = writer.StringEscapeHandling,
FloatFormatHandling = writer.FloatFormatHandling,
Culture = writer.Culture,
Formatting = writer.Formatting,
serializer.Serialize(nestedWriter, value);
writer.WriteValue(sw.ToString());
bool Disabled { get { return disabled; } set { disabled = value; } }
public override bool CanWrite { get { return !Disabled; } }
public override bool CanRead { get { return !Disabled; } }
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);
struct PushValue<T> : IDisposable
public PushValue(T value, Func<T> getValue, Action<T> setValue)
if (getValue == null || setValue == null)
throw new ArgumentNullException();
this.setValue = setValue;
this.oldValue = getValue();
#region IDisposable Members
public static void Test()
var testJson = GetJson();
var settings = new JsonSerializerSettings
Converters = { new EmbeddedLiteralConverter<JsonFile>() },
DateFormatString = "yyyy-MM-dd",
NullValueHandling = NullValueHandling.Ignore,
var response = JsonConvert.DeserializeObject<Response>(testJson, settings);
var json2 = JsonConvert.SerializeObject(response, Formatting.Indented, settings);
Console.WriteLine(json2);
""BRNumber"":""Session1""
""MNumber"":""15478655"",
\""@paraID\"":\""1000\"",
\""@label\"":\""We are america\""
\""@paraID\"":\""2000\"",
\""@label\"":\""We are japan\""
\""@paraID\"":\""3000\"",
\""@label\"":\""We are UK\""
\""@paraID\"":\""4000\"",
\""@label\"":\""We are China\""
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: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");