-Added serialized/deserialized JSON when verbose tracing

-Fixed not using default serializer settings with primitive values and JToken.ToObject
-Fixed error writing BigIntegers with JsonWriter.WriteToken
This commit is contained in:
James Newton-King
2013-05-19 22:34:21 +12:00
parent 32f326e46a
commit f68794d206
19 changed files with 996 additions and 97 deletions
@@ -137,7 +137,7 @@ namespace Newtonsoft.Json.Tests.Documentation
Staff staff = new Staff();
staff.Name = "Arnie Admin";
staff.Roles = new List<string> { "Administrator" };
staff.StartDate = DateTime.Now;
staff.StartDate = new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc);
ITraceWriter traceWriter = new MemoryTraceWriter();
@@ -152,12 +152,22 @@ namespace Newtonsoft.Json.Tests.Documentation
// 2012-11-11T12:08:42.797 Info Started serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
// 2012-11-11T12:08:42.798 Info Finished serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
// 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
// 2013-05-18T21:38:11.255 Verbose Serialized JSON:
// {
// "Name": "Arnie Admin",
// "StartDate": new Date(
// 976623132000
// ),
// "Roles": [
// "Administrator"
// ]
// }
#endregion
MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter;
Assert.AreEqual(743, memoryTraceWriter.ToString().Length);
Assert.AreEqual(6, memoryTraceWriter.GetTraceMessages().Count());
Assert.AreEqual(916, memoryTraceWriter.ToString().Length);
Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count());
}
}
}
@@ -44,6 +44,7 @@ using Newtonsoft.Json.Utilities.LinqBridge;
#else
using System.Linq;
#endif
using Newtonsoft.Json.Tests.Serialization;
namespace Newtonsoft.Json.Tests.Linq
{
@@ -63,6 +64,30 @@ namespace Newtonsoft.Json.Tests.Linq
Assert.AreEqual(typeof(decimal), v.Value.GetType());
}
[Test]
public void ToObjectWithDefaultSettings()
{
try
{
JsonConvert.DefaultSettings = () =>
{
return new JsonSerializerSettings
{
Converters = { new MetroStringConverter() }
};
};
JValue v = new JValue(":::STRING:::");
string s = v.ToObject<string>();
Assert.AreEqual("string", s);
}
finally
{
JsonConvert.DefaultSettings = null;
}
}
[Test]
public void ChangeValue()
{
@@ -150,7 +150,9 @@
<Compile Include="TestObjects\Container.cs" />
<Compile Include="TestObjects\ContentBaseClass.cs" />
<Compile Include="TestObjects\ContentSubClass.cs" />
<Compile Include="TestObjects\CustomerDataSet.cs" />
<Compile Include="TestObjects\CustomerDataSet.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="TestObjects\Foo.cs" />
<Compile Include="TestObjects\HolderClass.cs" />
<Compile Include="TestObjects\IPrivateImplementationA.cs" />
@@ -75,4 +75,4 @@ using System.Security;
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")]
[assembly: AssemblyFileVersion("5.0.4.16105")]
[assembly: AssemblyFileVersion("5.0.5.16119")]
@@ -313,8 +313,33 @@ namespace Newtonsoft.Json.Tests.Serialization
Assert.AreEqual(0, o.IntValue2);
Assert.AreEqual(null, o.ClassValue);
}
#if !NET20
[Test]
public void EmitDefaultValueIgnoreAndPopulate()
{
string str = "{}";
TestClass obj = JsonConvert.DeserializeObject<TestClass>(str, new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate
});
Assert.AreEqual("fff", obj.Field1);
}
#endif
}
#if !NET20
[DataContract]
public class TestClass
{
[JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DataMember(EmitDefaultValue = false)]
[DefaultValue("fff")]
public string Field1 { set; get; }
}
#endif
public class DefaultValueHandlingDeserialize
{
public string Derp { get; set; }
@@ -3,6 +3,9 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE || PORTABLE40)
using System.Numerics;
#endif
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Text;
@@ -68,12 +71,12 @@ Newtonsoft.Json Error: 0 : Error!
#endif
[Test]
public void MemoryTraceWriterTest()
public void MemoryTraceWriterSerializeTest()
{
Staff staff = new Staff();
staff.Name = "Arnie Admin";
staff.Roles = new List<string> {"Administrator"};
staff.StartDate = DateTime.Now;
staff.StartDate = new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc);
ITraceWriter traceWriter = new MemoryTraceWriter();
@@ -90,9 +93,74 @@ Newtonsoft.Json Error: 0 : Error!
// 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter;
string output = memoryTraceWriter.ToString();
Assert.AreEqual(743, memoryTraceWriter.ToString().Length);
Assert.AreEqual(6, memoryTraceWriter.GetTraceMessages().Count());
Assert.AreEqual(916, output.Length);
Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count());
string json = @"Serialized JSON:
{
""Name"": ""Arnie Admin"",
""StartDate"": new Date(
976623132000
),
""Roles"": [
""Administrator""
]
}";
Assert.IsTrue(output.Contains(json));
}
[Test]
public void MemoryTraceWriterDeserializeTest()
{
string json = @"{
""Name"": ""Arnie Admin"",
""StartDate"": new Date(
976623132000
),
""Roles"": [
""Administrator""
]
}";
Staff staff = new Staff();
staff.Name = "Arnie Admin";
staff.Roles = new List<string> { "Administrator" };
staff.StartDate = new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc);
ITraceWriter traceWriter = new MemoryTraceWriter();
JsonConvert.DeserializeObject<Staff>(
json,
new JsonSerializerSettings { TraceWriter = traceWriter, Converters = { new JavaScriptDateTimeConverter() } });
Console.WriteLine(traceWriter);
// 2012-11-11T12:08:42.761 Info Started serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
// 2012-11-11T12:08:42.785 Info Started serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
// 2012-11-11T12:08:42.791 Info Finished serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
// 2012-11-11T12:08:42.797 Info Started serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
// 2012-11-11T12:08:42.798 Info Finished serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
// 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
// 2013-05-19T00:07:24.360 Verbose Deserialized JSON:
// {
// "Name": "Arnie Admin",
// "StartDate": new Date(
// 976623132000
// ),
// "Roles": [
// "Administrator"
// ]
// }
MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter;
string output = memoryTraceWriter.ToString();
Assert.AreEqual(1059, output.Length);
Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count());
Assert.IsTrue(output.Contains(json));
}
[Test]
@@ -152,6 +220,8 @@ Newtonsoft.Json Error: 0 : Error!
Assert.AreEqual("Started serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[7].Message);
Assert.AreEqual("Finished serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[8].Message);
Assert.AreEqual("Finished serializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''.", traceWriter.TraceRecords[9].Message);
Assert.IsFalse(traceWriter.TraceRecords.Any(r => r.Level == TraceLevel.Verbose));
}
[Test]
@@ -208,6 +278,8 @@ Newtonsoft.Json Error: 0 : Error!
Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 9.", traceWriter.TraceRecords[8].Message);
Assert.AreEqual("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary', line 22, position 4.", traceWriter.TraceRecords[9].Message);
Assert.AreEqual("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path '', line 23, position 2.", traceWriter.TraceRecords[10].Message);
Assert.IsFalse(traceWriter.TraceRecords.Any(r => r.Level == TraceLevel.Verbose));
}
[Test]
@@ -644,6 +716,239 @@ Newtonsoft.Json Error: 0 : Error!
Assert.AreEqual(27, deserialized.Age);
Assert.AreEqual(23, deserialized.FavoriteNumber);
}
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE || PORTABLE40)
[Test]
public void TraceJsonWriterTest()
{
StringWriter sw = new StringWriter(CultureInfo.InvariantCulture);
JsonTextWriter w = new JsonTextWriter(sw);
TraceJsonWriter traceWriter = new TraceJsonWriter(w);
traceWriter.WriteStartObject();
traceWriter.WritePropertyName("Array");
traceWriter.WriteStartArray();
traceWriter.WriteValue("String!");
traceWriter.WriteValue(new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc));
traceWriter.WriteValue(new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.FromHours(2)));
traceWriter.WriteValue(1.1f);
traceWriter.WriteValue(1.1d);
traceWriter.WriteValue(1.1m);
traceWriter.WriteValue(1);
traceWriter.WriteValue((char)'!');
traceWriter.WriteValue((short)1);
traceWriter.WriteValue((ushort)1);
traceWriter.WriteValue((int)1);
traceWriter.WriteValue((uint)1);
traceWriter.WriteValue((sbyte)1);
traceWriter.WriteValue((byte)1);
traceWriter.WriteValue((long)1);
traceWriter.WriteValue((ulong)1);
traceWriter.WriteValue((bool)true);
traceWriter.WriteValue((DateTime?)new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc));
traceWriter.WriteValue((DateTimeOffset?)new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.FromHours(2)));
traceWriter.WriteValue((float?)1.1f);
traceWriter.WriteValue((double?)1.1d);
traceWriter.WriteValue((decimal?)1.1m);
traceWriter.WriteValue((int?)1);
traceWriter.WriteValue((char?)'!');
traceWriter.WriteValue((short?)1);
traceWriter.WriteValue((ushort?)1);
traceWriter.WriteValue((int?)1);
traceWriter.WriteValue((uint?)1);
traceWriter.WriteValue((sbyte?)1);
traceWriter.WriteValue((byte?)1);
traceWriter.WriteValue((long?)1);
traceWriter.WriteValue((ulong?)1);
traceWriter.WriteValue((bool?)true);
traceWriter.WriteValue(BigInteger.Parse("9999999990000000000000000000000000000000000"));
traceWriter.WriteValue((object)true);
traceWriter.WriteValue(TimeSpan.FromMinutes(1));
traceWriter.WriteValue(Guid.Empty);
traceWriter.WriteValue(new Uri("http://www.google.com/"));
traceWriter.WriteValue(Encoding.UTF8.GetBytes("String!"));
traceWriter.WriteRawValue("[1],");
traceWriter.WriteRaw("[1]");
traceWriter.WriteNull();
traceWriter.WriteUndefined();
traceWriter.WriteStartConstructor("ctor");
traceWriter.WriteValue(1);
traceWriter.WriteEndConstructor();
traceWriter.WriteComment("A comment");
traceWriter.WriteWhitespace(" ");
traceWriter.WriteEnd();
traceWriter.WriteEndObject();
traceWriter.Flush();
traceWriter.Close();
Console.WriteLine(traceWriter.GetJson());
Assert.AreEqual(@"{
""Array"": [
""String!"",
""2000-12-12T12:12:12Z"",
""2000-12-12T12:12:12+02:00"",
1.1,
1.1,
1.1,
1,
""!"",
1,
1,
1,
1,
1,
1,
1,
1,
true,
""2000-12-12T12:12:12Z"",
""2000-12-12T12:12:12+02:00"",
1.1,
1.1,
1.1,
1,
""!"",
1,
1,
1,
1,
1,
1,
1,
1,
1,
true,
9999999990000000000000000000000000000000000,
true,
true,
""00:01:00"",
""00000000-0000-0000-0000-000000000000"",
""http://www.google.com/"",
""U3RyaW5nIQ=="",
[1],[1],[1],
null,
undefined,
new ctor(
1
)
/*A comment*/
]
}", traceWriter.GetJson());
}
[Test]
public void TraceJsonReaderTest()
{
string json = @"{
""Array"": [
""String!"",
""2000-12-12T12:12:12Z"",
""2000-12-12T12:12:12Z"",
""2000-12-12T12:12:12+00:00"",
""U3RyaW5nIQ=="",
1,
1.1,
9999999990000000000000000000000000000000000,
null,
undefined,
new ctor(
1
)
/*A comment*/
]
}";
StringReader sw = new StringReader(json);
JsonTextReader w = new JsonTextReader(sw);
TraceJsonReader traceReader = new TraceJsonReader(w);
traceReader.Read();
Assert.AreEqual(JsonToken.StartObject, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.PropertyName, traceReader.TokenType);
Assert.AreEqual("Array", traceReader.Value);
traceReader.Read();
Assert.AreEqual(JsonToken.StartArray, traceReader.TokenType);
Assert.AreEqual(null, traceReader.Value);
traceReader.ReadAsString();
Assert.AreEqual(JsonToken.String, traceReader.TokenType);
Assert.AreEqual('"', traceReader.QuoteChar);
Assert.AreEqual("String!", traceReader.Value);
// for great code coverage justice!
traceReader.QuoteChar = '\'';
Assert.AreEqual('\'', traceReader.QuoteChar);
traceReader.ReadAsString();
Assert.AreEqual(JsonToken.String, traceReader.TokenType);
Assert.AreEqual("2000-12-12T12:12:12Z", traceReader.Value);
traceReader.ReadAsDateTime();
Assert.AreEqual(JsonToken.Date, traceReader.TokenType);
Assert.AreEqual(new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc), traceReader.Value);
traceReader.ReadAsDateTimeOffset();
Assert.AreEqual(JsonToken.Date, traceReader.TokenType);
Assert.AreEqual(new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.Zero), traceReader.Value);
traceReader.ReadAsBytes();
Assert.AreEqual(JsonToken.Bytes, traceReader.TokenType);
Assert.AreEqual(Encoding.UTF8.GetBytes("String!"), traceReader.Value);
traceReader.ReadAsInt32();
Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
Assert.AreEqual(1, traceReader.Value);
traceReader.ReadAsDecimal();
Assert.AreEqual(JsonToken.Float, traceReader.TokenType);
Assert.AreEqual(1.1m, traceReader.Value);
traceReader.Read();
Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
Assert.AreEqual(typeof(BigInteger), traceReader.ValueType);
Assert.AreEqual(BigInteger.Parse("9999999990000000000000000000000000000000000"), traceReader.Value);
traceReader.Read();
Assert.AreEqual(JsonToken.Null, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.Undefined, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.StartConstructor, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
Assert.AreEqual(1, traceReader.Value);
traceReader.Read();
Assert.AreEqual(JsonToken.EndConstructor, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.Comment, traceReader.TokenType);
Assert.AreEqual("A comment", traceReader.Value);
traceReader.Read();
Assert.AreEqual(JsonToken.EndArray, traceReader.TokenType);
traceReader.Read();
Assert.AreEqual(JsonToken.EndObject, traceReader.TokenType);
Assert.IsFalse(traceReader.Read());
traceReader.Close();
Console.WriteLine(traceReader.GetJson());
Assert.AreEqual(json, traceReader.GetJson());
}
#endif
}
public class TraceRecord
+17 -2
View File
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.Serialization.Formatters;
@@ -702,8 +703,15 @@ namespace Newtonsoft.Json
reader.MaxDepth = _maxDepth;
}
TraceJsonReader traceJsonReader = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
? new TraceJsonReader(reader)
: null;
JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this);
object value = serializerReader.Deserialize(reader, objectType, CheckAdditionalContent);
object value = serializerReader.Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent);
if (traceJsonReader != null)
TraceWriter.Trace(TraceLevel.Verbose, "Deserialized JSON: " + Environment.NewLine + traceJsonReader.GetJson(), null);
// reset reader back to previous options
if (previousCulture != null)
@@ -828,8 +836,15 @@ namespace Newtonsoft.Json
jsonWriter.DateFormatString = _dateFormatString;
}
TraceJsonWriter traceJsonWriter = (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
? new TraceJsonWriter(jsonWriter)
: null;
JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(this);
serializerWriter.Serialize(jsonWriter, value, objectType);
serializerWriter.Serialize(traceJsonWriter ?? jsonWriter, value, objectType);
if (traceJsonWriter != null)
TraceWriter.Trace(TraceLevel.Verbose, "Serialized JSON: " + Environment.NewLine + traceJsonWriter.GetJson(), null);
// reset writer back to previous options
if (previousFormatting != null)
+19 -5
View File
@@ -432,7 +432,7 @@ namespace Newtonsoft.Json
/// <param name="reader">The <see cref="JsonReader"/> to read the token from.</param>
public void WriteToken(JsonReader reader)
{
WriteToken(reader, true);
WriteToken(reader, true, true);
}
/// <summary>
@@ -444,6 +444,11 @@ namespace Newtonsoft.Json
{
ValidationUtils.ArgumentNotNull(reader, "reader");
WriteToken(reader, writeChildren, true);
}
internal void WriteToken(JsonReader reader, bool writeChildren, bool writeDateConstructorAsDate)
{
int initialDepth;
if (reader.TokenType == JsonToken.None)
@@ -453,10 +458,10 @@ namespace Newtonsoft.Json
else
initialDepth = reader.Depth;
WriteToken(reader, initialDepth, writeChildren);
WriteToken(reader, initialDepth, writeChildren, writeDateConstructorAsDate);
}
internal void WriteToken(JsonReader reader, int initialDepth, bool writeChildren)
internal void WriteToken(JsonReader reader, int initialDepth, bool writeChildren, bool writeDateConstructorAsDate)
{
do
{
@@ -474,7 +479,7 @@ namespace Newtonsoft.Json
case JsonToken.StartConstructor:
string constructorName = reader.Value.ToString();
// write a JValue date when the constructor is for a date
if (string.Equals(constructorName, "Date", StringComparison.Ordinal))
if (writeDateConstructorAsDate && string.Equals(constructorName, "Date", StringComparison.Ordinal))
WriteConstructorDate(reader);
else
WriteStartConstructor(reader.Value.ToString());
@@ -486,7 +491,16 @@ namespace Newtonsoft.Json
WriteComment((reader.Value != null) ? reader.Value.ToString() : null);
break;
case JsonToken.Integer:
WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture));
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE || PORTABLE40)
if (reader.Value is BigInteger)
{
WriteValue((BigInteger)reader.Value);
}
else
#endif
{
WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture));
}
break;
case JsonToken.Float:
object value = reader.Value;
+82 -79
View File
@@ -1603,90 +1603,93 @@ namespace Newtonsoft.Json.Linq
/// <returns>The new object created from the JSON value.</returns>
public object ToObject(Type objectType)
{
PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(objectType);
switch (typeCode)
if (JsonConvert.DefaultSettings == null)
{
case PrimitiveTypeCode.BooleanNullable:
return (bool?) this;
case PrimitiveTypeCode.Boolean:
return (bool) this;
case PrimitiveTypeCode.CharNullable:
return (char?) this;
case PrimitiveTypeCode.Char:
return (char) this;
case PrimitiveTypeCode.SByte:
return (sbyte?) this;
case PrimitiveTypeCode.SByteNullable:
return (sbyte) this;
case PrimitiveTypeCode.ByteNullable:
return (byte?) this;
case PrimitiveTypeCode.Byte:
return (byte) this;
case PrimitiveTypeCode.Int16Nullable:
return (short?) this;
case PrimitiveTypeCode.Int16:
return (short) this;
case PrimitiveTypeCode.UInt16Nullable:
return (ushort?) this;
case PrimitiveTypeCode.UInt16:
return (ushort) this;
case PrimitiveTypeCode.Int32Nullable:
return (int?) this;
case PrimitiveTypeCode.Int32:
return (int) this;
case PrimitiveTypeCode.UInt32Nullable:
return (uint?) this;
case PrimitiveTypeCode.UInt32:
return (uint) this;
case PrimitiveTypeCode.Int64Nullable:
return (long?) this;
case PrimitiveTypeCode.Int64:
return (long) this;
case PrimitiveTypeCode.UInt64Nullable:
return (ulong?) this;
case PrimitiveTypeCode.UInt64:
return (ulong) this;
case PrimitiveTypeCode.SingleNullable:
return (float?) this;
case PrimitiveTypeCode.Single:
return (float) this;
case PrimitiveTypeCode.DoubleNullable:
return (double?) this;
case PrimitiveTypeCode.Double:
return (double) this;
case PrimitiveTypeCode.DecimalNullable:
return (decimal?) this;
case PrimitiveTypeCode.Decimal:
return (decimal) this;
case PrimitiveTypeCode.DateTimeNullable:
return (DateTime?) this;
case PrimitiveTypeCode.DateTime:
return (DateTime) this;
PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(objectType);
switch (typeCode)
{
case PrimitiveTypeCode.BooleanNullable:
return (bool?)this;
case PrimitiveTypeCode.Boolean:
return (bool)this;
case PrimitiveTypeCode.CharNullable:
return (char?)this;
case PrimitiveTypeCode.Char:
return (char)this;
case PrimitiveTypeCode.SByte:
return (sbyte?)this;
case PrimitiveTypeCode.SByteNullable:
return (sbyte)this;
case PrimitiveTypeCode.ByteNullable:
return (byte?)this;
case PrimitiveTypeCode.Byte:
return (byte)this;
case PrimitiveTypeCode.Int16Nullable:
return (short?)this;
case PrimitiveTypeCode.Int16:
return (short)this;
case PrimitiveTypeCode.UInt16Nullable:
return (ushort?)this;
case PrimitiveTypeCode.UInt16:
return (ushort)this;
case PrimitiveTypeCode.Int32Nullable:
return (int?)this;
case PrimitiveTypeCode.Int32:
return (int)this;
case PrimitiveTypeCode.UInt32Nullable:
return (uint?)this;
case PrimitiveTypeCode.UInt32:
return (uint)this;
case PrimitiveTypeCode.Int64Nullable:
return (long?)this;
case PrimitiveTypeCode.Int64:
return (long)this;
case PrimitiveTypeCode.UInt64Nullable:
return (ulong?)this;
case PrimitiveTypeCode.UInt64:
return (ulong)this;
case PrimitiveTypeCode.SingleNullable:
return (float?)this;
case PrimitiveTypeCode.Single:
return (float)this;
case PrimitiveTypeCode.DoubleNullable:
return (double?)this;
case PrimitiveTypeCode.Double:
return (double)this;
case PrimitiveTypeCode.DecimalNullable:
return (decimal?)this;
case PrimitiveTypeCode.Decimal:
return (decimal)this;
case PrimitiveTypeCode.DateTimeNullable:
return (DateTime?)this;
case PrimitiveTypeCode.DateTime:
return (DateTime)this;
#if !NET20
case PrimitiveTypeCode.DateTimeOffsetNullable:
return (DateTimeOffset?) this;
case PrimitiveTypeCode.DateTimeOffset:
return (DateTimeOffset) this;
case PrimitiveTypeCode.DateTimeOffsetNullable:
return (DateTimeOffset?)this;
case PrimitiveTypeCode.DateTimeOffset:
return (DateTimeOffset)this;
#endif
case PrimitiveTypeCode.String:
return (string) this;
case PrimitiveTypeCode.GuidNullable:
return (Guid?) this;
case PrimitiveTypeCode.Guid:
return (Guid) this;
case PrimitiveTypeCode.Uri:
return (Uri) this;
case PrimitiveTypeCode.TimeSpanNullable:
return (TimeSpan?)this;
case PrimitiveTypeCode.TimeSpan:
return (TimeSpan)this;
case PrimitiveTypeCode.String:
return (string)this;
case PrimitiveTypeCode.GuidNullable:
return (Guid?)this;
case PrimitiveTypeCode.Guid:
return (Guid)this;
case PrimitiveTypeCode.Uri:
return (Uri)this;
case PrimitiveTypeCode.TimeSpanNullable:
return (TimeSpan?)this;
case PrimitiveTypeCode.TimeSpan:
return (TimeSpan)this;
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE40 || PORTABLE)
case PrimitiveTypeCode.BigIntegerNullable:
return ToBigIntegerNullable(this);
case PrimitiveTypeCode.BigInteger:
return ToBigInteger(this);
case PrimitiveTypeCode.BigIntegerNullable:
return ToBigIntegerNullable(this);
case PrimitiveTypeCode.BigInteger:
return ToBigInteger(this);
#endif
}
}
return ToObject(objectType, JsonSerializer.CreateDefault());
@@ -113,6 +113,8 @@
<Compile Include="Serialization\JsonContainerContract.cs" />
<Compile Include="Serialization\JsonDynamicContract.cs" />
<Compile Include="Serialization\MemoryTraceWriter.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StreamingContext.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="Utilities\DateTimeParser.cs" />
@@ -124,6 +124,8 @@
<Compile Include="Serialization\ITraceWriter.cs" />
<Compile Include="Serialization\JsonContainerContract.cs" />
<Compile Include="Serialization\MemoryTraceWriter.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StreamingContext.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="TraceLevel.cs" />
@@ -124,6 +124,8 @@
<Compile Include="Serialization\ITraceWriter.cs" />
<Compile Include="Serialization\JsonContainerContract.cs" />
<Compile Include="Serialization\MemoryTraceWriter.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="Utilities\DateTimeParser.cs" />
<Compile Include="Utilities\DynamicProxy.cs" />
@@ -183,6 +183,8 @@
<Compile Include="Serialization\ObjectConstructor.cs" />
<Compile Include="Serialization\OnErrorAttribute.cs" />
<Compile Include="Serialization\ReflectionValueProvider.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StreamingContext.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="TraceLevel.cs" />
@@ -183,6 +183,8 @@
<Compile Include="Serialization\ObjectConstructor.cs" />
<Compile Include="Serialization\OnErrorAttribute.cs" />
<Compile Include="Serialization\ReflectionValueProvider.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StreamingContext.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="TraceLevel.cs" />
@@ -184,6 +184,8 @@
<Compile Include="Serialization\ObjectConstructor.cs" />
<Compile Include="Serialization\OnErrorAttribute.cs" />
<Compile Include="Serialization\ReflectionValueProvider.cs" />
<Compile Include="Serialization\TraceJsonReader.cs" />
<Compile Include="Serialization\TraceJsonWriter.cs" />
<Compile Include="StreamingContext.cs" />
<Compile Include="StringEscapeHandling.cs" />
<Compile Include="TraceLevel.cs" />
@@ -92,6 +92,6 @@ using System.Security;
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")]
[assembly: AssemblyFileVersion("5.0.4.16105")]
[assembly: AssemblyFileVersion("5.0.5.16119")]
[assembly: CLSCompliant(true)]
@@ -229,7 +229,7 @@ namespace Newtonsoft.Json.Serialization
writer.WriteStartObject();
if (reader.TokenType == JsonToken.PropertyName)
writer.WriteToken(reader, reader.Depth - 1, true);
writer.WriteToken(reader, reader.Depth - 1, true, true);
else
writer.WriteEndObject();
@@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;
namespace Newtonsoft.Json.Serialization
{
internal class TraceJsonReader : JsonReader, IJsonLineInfo
{
private readonly JsonReader _innerReader;
private readonly JsonTextWriter _textWriter;
private readonly StringWriter _sw;
public TraceJsonReader(JsonReader innerReader)
{
_innerReader = innerReader;
_sw = new StringWriter(CultureInfo.InvariantCulture);
_textWriter = new JsonTextWriter(_sw);
_textWriter.Formatting = Formatting.Indented;
}
public string GetJson()
{
return _sw.ToString();
}
public override bool Read()
{
var value = _innerReader.Read();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
public override int? ReadAsInt32()
{
var value = _innerReader.ReadAsInt32();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
public override string ReadAsString()
{
var value = _innerReader.ReadAsString();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
public override byte[] ReadAsBytes()
{
var value = _innerReader.ReadAsBytes();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
public override decimal? ReadAsDecimal()
{
var value = _innerReader.ReadAsDecimal();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
public override DateTime? ReadAsDateTime()
{
var value = _innerReader.ReadAsDateTime();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
#if !NET20
public override DateTimeOffset? ReadAsDateTimeOffset()
{
var value = _innerReader.ReadAsDateTimeOffset();
_textWriter.WriteToken(_innerReader, false, false);
return value;
}
#endif
public override int Depth
{
get { return _innerReader.Depth; }
}
public override string Path
{
get { return _innerReader.Path; }
}
public override char QuoteChar
{
get { return _innerReader.QuoteChar; }
protected internal set { _innerReader.QuoteChar = value; }
}
public override JsonToken TokenType
{
get { return _innerReader.TokenType; }
}
public override object Value
{
get { return _innerReader.Value; }
}
public override Type ValueType
{
get { return _innerReader.ValueType; }
}
public override void Close()
{
_innerReader.Close();
}
bool IJsonLineInfo.HasLineInfo()
{
IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo;
return lineInfo != null && lineInfo.HasLineInfo();
}
int IJsonLineInfo.LineNumber
{
get
{
IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo;
return (lineInfo != null) ? lineInfo.LineNumber : 0;
}
}
int IJsonLineInfo.LinePosition
{
get
{
IJsonLineInfo lineInfo = _innerReader as IJsonLineInfo;
return (lineInfo != null) ? lineInfo.LinePosition : 0;
}
}
}
}
@@ -0,0 +1,348 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE || PORTABLE40)
using System.Numerics;
#endif
using System.Text;
namespace Newtonsoft.Json.Serialization
{
internal class TraceJsonWriter : JsonWriter
{
private readonly JsonWriter _innerWriter;
private readonly JsonTextWriter _textWriter;
private readonly StringWriter _sw;
public TraceJsonWriter(JsonWriter innerWriter)
{
_innerWriter = innerWriter;
_sw = new StringWriter(CultureInfo.InvariantCulture);
_textWriter = new JsonTextWriter(_sw);
_textWriter.Formatting = Formatting.Indented;
_textWriter.Culture = innerWriter.Culture;
_textWriter.DateFormatHandling = innerWriter.DateFormatHandling;
_textWriter.DateFormatString = innerWriter.DateFormatString;
_textWriter.DateTimeZoneHandling = innerWriter.DateTimeZoneHandling;
_textWriter.FloatFormatHandling = innerWriter.FloatFormatHandling;
}
public string GetJson()
{
return _sw.ToString();
}
public override void WriteValue(decimal value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(bool value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(byte value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(byte? value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(char value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(byte[] value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(DateTime value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
#if !NET20
public override void WriteValue(DateTimeOffset value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
#endif
public override void WriteValue(double value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteUndefined()
{
_textWriter.WriteUndefined();
_innerWriter.WriteUndefined();
base.WriteUndefined();
}
public override void WriteNull()
{
_textWriter.WriteNull();
_innerWriter.WriteNull();
base.WriteUndefined();
}
public override void WriteValue(float value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(Guid value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(int value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(long value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(object value)
{
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE || PORTABLE40)
if (value is BigInteger)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
InternalWriteValue(JsonToken.Integer);
}
else
#endif
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
}
public override void WriteValue(sbyte value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(short value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(string value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(TimeSpan value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(uint value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(ulong value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(Uri value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteValue(ushort value)
{
_textWriter.WriteValue(value);
_innerWriter.WriteValue(value);
base.WriteValue(value);
}
public override void WriteWhitespace(string ws)
{
_textWriter.WriteWhitespace(ws);
_innerWriter.WriteWhitespace(ws);
base.WriteWhitespace(ws);
}
//protected override void WriteValueDelimiter()
//{
// _textWriter.WriteValueDelimiter();
// _innerWriter.WriteValueDelimiter();
// base.WriteValueDelimiter();
//}
//protected override void WriteIndent()
//{
// base.WriteIndent();
//}
public override void WriteComment(string text)
{
_textWriter.WriteComment(text);
_innerWriter.WriteComment(text);
base.WriteComment(text);
}
//public override void WriteEnd()
//{
// _textWriter.WriteEnd();
// _innerWriter.WriteEnd();
// base.WriteEnd();
//}
//protected override void WriteEnd(JsonToken token)
//{
// base.WriteEnd(token);
//}
public override void WriteStartArray()
{
_textWriter.WriteStartArray();
_innerWriter.WriteStartArray();
base.WriteStartArray();
}
public override void WriteEndArray()
{
_textWriter.WriteEndArray();
_innerWriter.WriteEndArray();
base.WriteEndArray();
}
public override void WriteStartConstructor(string name)
{
_textWriter.WriteStartConstructor(name);
_innerWriter.WriteStartConstructor(name);
base.WriteStartConstructor(name);
}
public override void WriteEndConstructor()
{
_textWriter.WriteEndConstructor();
_innerWriter.WriteEndConstructor();
base.WriteEndConstructor();
}
public override void WritePropertyName(string name)
{
_textWriter.WritePropertyName(name);
_innerWriter.WritePropertyName(name);
base.WritePropertyName(name);
}
public override void WritePropertyName(string name, bool escape)
{
_textWriter.WritePropertyName(name, escape);
_innerWriter.WritePropertyName(name, escape);
// method with escape will error
base.WritePropertyName(name);
}
public override void WriteStartObject()
{
_textWriter.WriteStartObject();
_innerWriter.WriteStartObject();
base.WriteStartObject();
}
public override void WriteEndObject()
{
_textWriter.WriteEndObject();
_innerWriter.WriteEndObject();
base.WriteEndObject();
}
public override void WriteRaw(string json)
{
_textWriter.WriteRaw(json);
_innerWriter.WriteRaw(json);
base.WriteRaw(json);
}
public override void WriteRawValue(string json)
{
_textWriter.WriteRawValue(json);
_innerWriter.WriteRawValue(json);
base.WriteRawValue(json);
}
//protected override void WriteIndentSpace()
//{
// _textWriter.WriteIndentSpace();
// _innerWriter.WriteIndentSpace();
// base.WriteIndentSpace();
//}
public override void Close()
{
_textWriter.Close();
_innerWriter.Close();
base.Close();
}
public override void Flush()
{
_textWriter.Flush();
_innerWriter.Flush();
}
}
}