diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
index 0076a546..9be99ab5 100644
--- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
+++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
@@ -1811,5 +1811,31 @@ bye", reader.Value);
Assert.AreEqual(JsonToken.Float, reader.TokenType);
Assert.AreEqual(32m, reader.Value);
}
+
+ [Test]
+ public void ParseNumbers()
+ {
+ string json = @"[0,1,2 , 3]";
+
+ JsonTextReader reader = new JsonTextReader(new StringReader(json));
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.Integer, reader.TokenType);
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.Integer, reader.TokenType);
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.Integer, reader.TokenType);
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.Integer, reader.TokenType);
+
+ reader.Read();
+ Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
+ }
}
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
index 0793cb61..614bd083 100644
--- a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
+++ b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
@@ -29,6 +29,7 @@ using System.Text;
using NUnit.Framework;
using Newtonsoft.Json;
using System.IO;
+using Newtonsoft.Json.Utilities;
namespace Newtonsoft.Json.Tests
{
@@ -618,5 +619,30 @@ _____'propertyName': NaN
Assert.AreEqual(expected, result);
}
+
+ [Test]
+ public void BuildStateArray()
+ {
+ JsonWriter.State[][] stateArray = JsonWriter.BuildStateArray();
+
+ var valueStates = JsonWriter.StateArrayTempate[7];
+
+ foreach (JsonToken valueToken in EnumUtils.GetValues(typeof(JsonToken)))
+ {
+ switch (valueToken)
+ {
+ case JsonToken.Integer:
+ case JsonToken.Float:
+ case JsonToken.String:
+ case JsonToken.Boolean:
+ case JsonToken.Null:
+ case JsonToken.Undefined:
+ case JsonToken.Date:
+ case JsonToken.Bytes:
+ Assert.AreEqual(valueStates, stateArray[(int)valueToken], "Error for " + valueToken + " states.");
+ break;
+ }
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs
index 89fcdcdc..97af7d1c 100644
--- a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs
+++ b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Linq;
@@ -35,8 +36,19 @@ namespace Newtonsoft.Json.Tests
public class PerformanceTests : TestFixtureBase
{
- private const int Iterations = 100;
- //private const int Iterations = 5000;
+ //private const int Iterations = 100;
+ private const int Iterations = 5000;
+
+ private static SimpleObject CreateSimpleObject()
+ {
+ return new SimpleObject
+ {
+ Name = "Simple-1",
+ Id = 2311,
+ Address = "Planet Earth",
+ Scores = new int[] { 82,96,49,40,38,38,78,96,2,39 }
+ };
+ }
#region Data
private const string BsonHex =
@@ -51,6 +63,9 @@ namespace Newtonsoft.Json.Tests
private const string JsonText =
@"{""strings"":[null,""Markus egger ]><[, (2nd)"",null],""dictionary"":{""Val & asd1"":1,""Val2 & asd1"":3,""Val3 & asd1"":4},""Name"":""Rick"",""Now"":""\/Date(1262301136080+1300)\/"",""BigNumber"":34123123123.121,""Address1"":{""Street"":""fff Street"",""Phone"":""(503) 814-6335"",""Entered"":""\/Date(1264025536080+1300)\/""},""Addresses"":[{""Street"":""\u001farray
(SimpleJsonText);
+ }
+
[Test]
public void Serialize()
{
TestClass test = CreateSerializationObject();
- BenchmarkSerializeMethod(SerializeMethod.DataContractSerializer, test);
- BenchmarkSerializeMethod(SerializeMethod.BinaryFormatter, test);
- BenchmarkSerializeMethod(SerializeMethod.JavaScriptSerializer, test);
- BenchmarkSerializeMethod(SerializeMethod.DataContractJsonSerializer, test);
- BenchmarkSerializeMethod(SerializeMethod.JsonNet, test);
- BenchmarkSerializeMethod(SerializeMethod.JsonNetBinary, test);
+ SerializeTests(test);
+ }
+
+ private void SerializeTests(object value)
+ {
+ //BenchmarkSerializeMethod(SerializeMethod.DataContractSerializer, value);
+ ////BenchmarkSerializeMethod(SerializeMethod.BinaryFormatter, value);
+ //BenchmarkSerializeMethod(SerializeMethod.JavaScriptSerializer, value);
+ //BenchmarkSerializeMethod(SerializeMethod.DataContractJsonSerializer, value);
+ BenchmarkSerializeMethod(SerializeMethod.JsonNet, value);
+ //BenchmarkSerializeMethod(SerializeMethod.JsonNetBinary, value);
}
[Test]
@@ -80,12 +114,17 @@ namespace Newtonsoft.Json.Tests
{
BenchmarkDeserializeMethod(SerializeMethod.DataContractSerializer, XmlText);
BenchmarkDeserializeMethod(SerializeMethod.BinaryFormatter, MiscellaneousUtils.HexToBytes(BinaryFormatterHex));
- BenchmarkDeserializeMethod(SerializeMethod.JavaScriptSerializer, JsonText);
- BenchmarkDeserializeMethod(SerializeMethod.DataContractJsonSerializer, JsonText);
- BenchmarkDeserializeMethod(SerializeMethod.JsonNet, JsonText);
+ DeserializeTests(JsonText);
BenchmarkDeserializeMethod(SerializeMethod.JsonNetBinary, MiscellaneousUtils.HexToBytes(BsonHex));
}
+ public void DeserializeTests(string json)
+ {
+ BenchmarkDeserializeMethod(SerializeMethod.JavaScriptSerializer, json);
+ BenchmarkDeserializeMethod(SerializeMethod.DataContractJsonSerializer, json);
+ BenchmarkDeserializeMethod(SerializeMethod.JsonNet, json);
+ }
+
[Test]
public void SerializeSizeNormal()
{
@@ -722,6 +761,22 @@ namespace Newtonsoft.Json.Tests
}
private DateTime _Entered = DateTime.Parse("01/01/2007", CultureInfo.CurrentCulture.DateTimeFormat);
}
+
+ [DataContract]
+ public class SimpleObject
+ {
+ [DataMember]
+ public int Id { get; set; }
+
+ [DataMember]
+ public string Name { get; set; }
+
+ [DataMember]
+ public string Address { get; set; }
+
+ [DataMember]
+ public int[] Scores { get; set; }
+ }
#endregion
}
#endif
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json/Bson/BsonReader.cs b/Src/Newtonsoft.Json/Bson/BsonReader.cs
index 8391e062..569183f1 100644
--- a/Src/Newtonsoft.Json/Bson/BsonReader.cs
+++ b/Src/Newtonsoft.Json/Bson/BsonReader.cs
@@ -39,10 +39,10 @@ namespace Newtonsoft.Json.Bson
public class BsonReader : JsonReader
{
private const int MaxCharBytesSize = 128;
- private static readonly byte[] _seqRange1 = new byte[] { 0, 127 }; // range of 1-byte sequence
- private static readonly byte[] _seqRange2 = new byte[] { 194, 223 }; // range of 2-byte sequence
- private static readonly byte[] _seqRange3 = new byte[] { 224, 239 }; // range of 3-byte sequence
- private static readonly byte[] _seqRange4 = new byte[] { 240, 244 }; // range of 4-byte sequence
+ private static readonly byte[] SeqRange1 = new byte[] { 0, 127 }; // range of 1-byte sequence
+ private static readonly byte[] SeqRange2 = new byte[] { 194, 223 }; // range of 2-byte sequence
+ private static readonly byte[] SeqRange3 = new byte[] { 224, 239 }; // range of 3-byte sequence
+ private static readonly byte[] SeqRange4 = new byte[] { 240, 244 }; // range of 4-byte sequence
private readonly BinaryReader _reader;
private readonly List _stack;
@@ -778,10 +778,10 @@ namespace Newtonsoft.Json.Bson
private int BytesInSequence(byte b)
{
- if (b <= _seqRange1[1]) return 1;
- if (b >= _seqRange2[0] && b <= _seqRange2[1]) return 2;
- if (b >= _seqRange3[0] && b <= _seqRange3[1]) return 3;
- if (b >= _seqRange4[0] && b <= _seqRange4[1]) return 4;
+ if (b <= SeqRange1[1]) return 1;
+ if (b >= SeqRange2[0] && b <= SeqRange2[1]) return 2;
+ if (b >= SeqRange3[0] && b <= SeqRange3[1]) return 3;
+ if (b >= SeqRange4[0] && b <= SeqRange4[1]) return 4;
return 0;
}
diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
index 65dcba70..cd6a9e22 100644
--- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
+++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
@@ -88,9 +88,9 @@ namespace Newtonsoft.Json.Converters
return new XmlElementWrapper(_document.CreateElement(elementName));
}
- public IXmlElement CreateElement(string qualifiedName, string namespaceURI)
+ public IXmlElement CreateElement(string qualifiedName, string namespaceUri)
{
- return new XmlElementWrapper(_document.CreateElement(qualifiedName, namespaceURI));
+ return new XmlElementWrapper(_document.CreateElement(qualifiedName, namespaceUri));
}
public IXmlNode CreateAttribute(string name, string value)
@@ -101,9 +101,9 @@ namespace Newtonsoft.Json.Converters
return attribute;
}
- public IXmlNode CreateAttribute(string qualifiedName, string namespaceURI, string value)
+ public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value)
{
- XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(qualifiedName, namespaceURI));
+ XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(qualifiedName, namespaceUri));
attribute.Value = value;
return attribute;
@@ -138,9 +138,9 @@ namespace Newtonsoft.Json.Converters
_element.SetAttributeNode((XmlAttribute) xmlAttributeWrapper.WrappedNode);
}
- public string GetPrefixOfNamespace(string namespaceURI)
+ public string GetPrefixOfNamespace(string namespaceUri)
{
- return _element.GetPrefixOfNamespace(namespaceURI);
+ return _element.GetPrefixOfNamespace(namespaceUri);
}
}
@@ -264,7 +264,7 @@ namespace Newtonsoft.Json.Converters
get { return _node.Prefix; }
}
- public string NamespaceURI
+ public string NamespaceUri
{
get { return _node.NamespaceURI; }
}
@@ -283,9 +283,9 @@ namespace Newtonsoft.Json.Converters
IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone);
IXmlNode CreateProcessingInstruction(string target, string data);
IXmlElement CreateElement(string elementName);
- IXmlElement CreateElement(string qualifiedName, string namespaceURI);
+ IXmlElement CreateElement(string qualifiedName, string namespaceUri);
IXmlNode CreateAttribute(string name, string value);
- IXmlNode CreateAttribute(string qualifiedName, string namespaceURI, string value);
+ IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value);
IXmlElement DocumentElement { get; }
}
@@ -300,7 +300,7 @@ namespace Newtonsoft.Json.Converters
internal interface IXmlElement : IXmlNode
{
void SetAttributeNode(IXmlNode attribute);
- string GetPrefixOfNamespace(string namespaceURI);
+ string GetPrefixOfNamespace(string namespaceUri);
}
internal interface IXmlNode
@@ -312,7 +312,7 @@ namespace Newtonsoft.Json.Converters
IXmlNode ParentNode { get; }
string Value { get; set; }
IXmlNode AppendChild(IXmlNode newChild);
- string NamespaceURI { get; }
+ string NamespaceUri { get; }
object WrappedNode { get; }
}
#endregion
@@ -321,12 +321,12 @@ namespace Newtonsoft.Json.Converters
#if !NET20
internal class XDeclarationWrapper : XObjectWrapper, IXmlDeclaration
{
- internal readonly XDeclaration _declaration;
+ internal XDeclaration Declaration { get; private set; }
public XDeclarationWrapper(XDeclaration declaration)
: base(null)
{
- _declaration = declaration;
+ Declaration = declaration;
}
public override XmlNodeType NodeType
@@ -336,19 +336,19 @@ namespace Newtonsoft.Json.Converters
public string Version
{
- get { return _declaration.Version; }
+ get { return Declaration.Version; }
}
public string Encoding
{
- get { return _declaration.Encoding; }
- set { _declaration.Encoding = value; }
+ get { return Declaration.Encoding; }
+ set { Declaration.Encoding = value; }
}
public string Standalone
{
- get { return _declaration.Standalone; }
- set { _declaration.Standalone = value; }
+ get { return Declaration.Standalone; }
+ set { Declaration.Standalone = value; }
}
}
@@ -417,10 +417,10 @@ namespace Newtonsoft.Json.Converters
return new XElementWrapper(new XElement(elementName));
}
- public IXmlElement CreateElement(string qualifiedName, string namespaceURI)
+ public IXmlElement CreateElement(string qualifiedName, string namespaceUri)
{
string localName = MiscellaneousUtils.GetLocalName(qualifiedName);
- return new XElementWrapper(new XElement(XName.Get(localName, namespaceURI)));
+ return new XElementWrapper(new XElement(XName.Get(localName, namespaceUri)));
}
public IXmlNode CreateAttribute(string name, string value)
@@ -428,10 +428,10 @@ namespace Newtonsoft.Json.Converters
return new XAttributeWrapper(new XAttribute(name, value));
}
- public IXmlNode CreateAttribute(string qualifiedName, string namespaceURI, string value)
+ public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value)
{
string localName = MiscellaneousUtils.GetLocalName(qualifiedName);
- return new XAttributeWrapper(new XAttribute(XName.Get(localName, namespaceURI), value));
+ return new XAttributeWrapper(new XAttribute(XName.Get(localName, namespaceUri), value));
}
public IXmlElement DocumentElement
@@ -450,7 +450,7 @@ namespace Newtonsoft.Json.Converters
XDeclarationWrapper declarationWrapper = newChild as XDeclarationWrapper;
if (declarationWrapper != null)
{
- Document.Declaration = declarationWrapper._declaration;
+ Document.Declaration = declarationWrapper.Declaration;
return declarationWrapper;
}
else
@@ -649,7 +649,7 @@ namespace Newtonsoft.Json.Converters
throw new InvalidOperationException();
}
- public virtual string NamespaceURI
+ public virtual string NamespaceUri
{
get { return null; }
}
@@ -678,7 +678,7 @@ namespace Newtonsoft.Json.Converters
get { return Attribute.Name.LocalName; }
}
- public override string NamespaceURI
+ public override string NamespaceUri
{
get { return Attribute.Name.NamespaceName; }
}
@@ -729,14 +729,14 @@ namespace Newtonsoft.Json.Converters
get { return Element.Name.LocalName; }
}
- public override string NamespaceURI
+ public override string NamespaceUri
{
get { return Element.Name.NamespaceName; }
}
- public string GetPrefixOfNamespace(string namespaceURI)
+ public string GetPrefixOfNamespace(string namespaceUri)
{
- return Element.GetPrefixOfNamespace(namespaceURI);
+ return Element.GetPrefixOfNamespace(namespaceUri);
}
}
#endif
@@ -836,7 +836,7 @@ namespace Newtonsoft.Json.Converters
manager.PushScope();
foreach (IXmlNode attribute in parentElement.Attributes)
{
- if (attribute.NamespaceURI == "http://www.w3.org/2000/xmlns/" && attribute.LocalName != "xmlns")
+ if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/" && attribute.LocalName != "xmlns")
manager.AddNamespace(attribute.LocalName, attribute.Value);
}
}
@@ -845,9 +845,9 @@ namespace Newtonsoft.Json.Converters
private string ResolveFullName(IXmlNode node, XmlNamespaceManager manager)
{
- string prefix = (node.NamespaceURI == null || (node.LocalName == "xmlns" && node.NamespaceURI == "http://www.w3.org/2000/xmlns/"))
+ string prefix = (node.NamespaceUri == null || (node.LocalName == "xmlns" && node.NamespaceUri == "http://www.w3.org/2000/xmlns/"))
? null
- : manager.LookupPrefix(node.NamespaceURI);
+ : manager.LookupPrefix(node.NamespaceUri);
if (!string.IsNullOrEmpty(prefix))
return prefix + ":" + node.LocalName;
@@ -860,7 +860,7 @@ namespace Newtonsoft.Json.Converters
switch (node.NodeType)
{
case XmlNodeType.Attribute:
- if (node.NamespaceURI == JsonNamespaceUri)
+ if (node.NamespaceUri == JsonNamespaceUri)
return "$" + node.LocalName;
else
return "@" + ResolveFullName(node, manager);
@@ -888,7 +888,7 @@ namespace Newtonsoft.Json.Converters
private bool IsArray(IXmlNode node)
{
IXmlNode jsonArrayAttribute = (node.Attributes != null)
- ? node.Attributes.SingleOrDefault(a => a.LocalName == "Array" && a.NamespaceURI == JsonNamespaceUri)
+ ? node.Attributes.SingleOrDefault(a => a.LocalName == "Array" && a.NamespaceUri == JsonNamespaceUri)
: null;
return (jsonArrayAttribute != null && XmlConvert.ToBoolean(jsonArrayAttribute.Value));
@@ -970,7 +970,7 @@ namespace Newtonsoft.Json.Converters
{
foreach (IXmlNode attribute in node.Attributes)
{
- if (attribute.NamespaceURI == "http://www.w3.org/2000/xmlns/")
+ if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/")
{
string prefix = (attribute.LocalName != "xmlns")
? attribute.LocalName
@@ -1020,10 +1020,10 @@ namespace Newtonsoft.Json.Converters
case XmlNodeType.ProcessingInstruction:
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
- if (node.NamespaceURI == "http://www.w3.org/2000/xmlns/" && node.Value == JsonNamespaceUri)
+ if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == JsonNamespaceUri)
return;
- if (node.NamespaceURI == JsonNamespaceUri)
+ if (node.NamespaceUri == JsonNamespaceUri)
{
if (node.LocalName == "Array")
return;
@@ -1512,7 +1512,7 @@ namespace Newtonsoft.Json.Converters
private IEnumerable ValueAttributes(IEnumerable c)
{
- return c.Where(a => a.NamespaceURI != JsonNamespaceUri);
+ return c.Where(a => a.NamespaceUri != JsonNamespaceUri);
}
#endregion
diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs
index 7564d9e3..1963c8e4 100644
--- a/Src/Newtonsoft.Json/JsonTextReader.cs
+++ b/Src/Newtonsoft.Json/JsonTextReader.cs
@@ -161,7 +161,7 @@ namespace Newtonsoft.Json
// once in the last 10% of the buffer shift the remainling content to the start to avoid
// unnessesarly increasing the buffer size when reading numbers/strings
int length = _chars.Length;
- if (length - _charPos <= length*0.1)
+ if (length - _charPos <= length * 0.1)
{
int count = _charsUsed - _charPos;
if (count > 0)
@@ -403,7 +403,7 @@ namespace Newtonsoft.Json
if (TokenType == JsonToken.Null)
return null;
if (TokenType == JsonToken.Bytes)
- return (byte[]) Value;
+ return (byte[])Value;
if (TokenType == JsonToken.StartArray)
{
List data = new List();
@@ -453,10 +453,10 @@ namespace Newtonsoft.Json
if (TokenType == JsonToken.Null)
return null;
if (TokenType == JsonToken.Float)
- return (decimal?) Value;
+ return (decimal?)Value;
decimal d;
- if (TokenType == JsonToken.String && decimal.TryParse((string) Value, NumberStyles.Number, Culture, out d))
+ if (TokenType == JsonToken.String && decimal.TryParse((string)Value, NumberStyles.Number, Culture, out d))
{
SetToken(JsonToken.Float, d);
return d;
@@ -486,10 +486,10 @@ namespace Newtonsoft.Json
if (TokenType == JsonToken.Null)
return null;
if (TokenType == JsonToken.Date)
- return (DateTimeOffset) Value;
+ return (DateTimeOffset)Value;
DateTimeOffset dt;
- if (TokenType == JsonToken.String && DateTimeOffset.TryParse((string) Value, Culture, DateTimeStyles.None, out dt))
+ if (TokenType == JsonToken.String && DateTimeOffset.TryParse((string)Value, Culture, DateTimeStyles.None, out dt))
{
SetToken(JsonToken.Date, dt);
return dt;
@@ -506,12 +506,6 @@ namespace Newtonsoft.Json
{
while (true)
{
- if (_charPos >= _charsUsed)
- {
- if (!ReadChars(0, false))
- return false;
- }
-
switch (_currentState)
{
case State.Start:
@@ -706,6 +700,58 @@ namespace Newtonsoft.Json
}
}
+ private void ReadNumberIntoBuffer()
+ {
+ int charPos = _charPos;
+
+ while (true)
+ {
+ switch (_chars[charPos++])
+ {
+ case '\0':
+ if (_charsUsed == charPos - 1)
+ {
+ charPos--;
+ _charPos = charPos;
+ if (ReadData(true) == 0)
+ return;
+ }
+ break;
+ case '-':
+ case '+':
+ case 'a':
+ case 'A':
+ case 'b':
+ case 'B':
+ case 'c':
+ case 'C':
+ case 'd':
+ case 'D':
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
+ case 'x':
+ case 'X':
+ case '.':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ break;
+ default:
+ _charPos = charPos - 1;
+ return;
+ }
+ }
+ }
+
private void ClearRecentString()
{
if (_buffer != null)
@@ -726,7 +772,10 @@ namespace Newtonsoft.Json
if (_charsUsed == _charPos)
{
if (ReadData(false) == 0)
+ {
+ _currentState = State.Finished;
return false;
+ }
}
else
{
@@ -890,7 +939,7 @@ namespace Newtonsoft.Json
{
if (ReadData(true) == 0)
throw CreateJsonReaderException("Unexpected end when parsing unquoted property name. Line {0}, position {1}.", LineNumber, LinePosition);
-
+
break;
}
@@ -909,7 +958,7 @@ namespace Newtonsoft.Json
_stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition);
return;
}
-
+
throw CreateJsonReaderException("Invalid JavaScript property identifier character: {0}. Line {1}, position {2}.", currentChar, LineNumber, LinePosition);
}
}
@@ -1173,32 +1222,7 @@ namespace Newtonsoft.Json
char firstChar = _chars[_charPos];
int initialPosition = _charPos;
- // parse until seperator character or end
- while (true)
- {
- char currentChar = _chars[_charPos];
-
- if (currentChar == '\0')
- {
- if (_charsUsed == _charPos)
- {
- if (ReadData(true) == 0)
- break;
- }
- else
- {
- _charPos++;
- }
- }
- else if (IsSeperator(currentChar))
- {
- break;
- }
- else
- {
- _charPos++;
- }
- }
+ ReadNumberIntoBuffer();
_stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition);
@@ -1240,7 +1264,7 @@ namespace Newtonsoft.Json
if (singleDigit)
{
// digit char values start at 48
- numberValue = (long) firstChar - 48;
+ numberValue = (long)firstChar - 48;
numberType = JsonToken.Integer;
}
else if (nonBase10)
@@ -1531,7 +1555,7 @@ namespace Newtonsoft.Json
{
if (CurrentState == State.Start && LinePosition == 0)
return 0;
-
+
return _lineNumber;
}
}
diff --git a/Src/Newtonsoft.Json/JsonWriter.cs b/Src/Newtonsoft.Json/JsonWriter.cs
index 0eb68379..fb430bf1 100644
--- a/Src/Newtonsoft.Json/JsonWriter.cs
+++ b/Src/Newtonsoft.Json/JsonWriter.cs
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
@@ -91,7 +92,7 @@ namespace Newtonsoft.Json
///
public abstract class JsonWriter : IDisposable
{
- private enum State
+ internal enum State
{
Start,
Property,
@@ -107,19 +108,58 @@ namespace Newtonsoft.Json
}
// array that gives a new state based on the current state an the token being written
- private static readonly State[][] stateArray = new[] {
-// Start PropertyName ObjectStart Object ArrayStart Array ConstructorStart Constructor Closed Error
+ private static readonly State[][] StateArray;
+
+ internal static readonly State[][] StateArrayTempate = new[] {
+// Start PropertyName ObjectStart Object ArrayStart Array ConstructorStart Constructor Closed Error
//
-/* None */new[]{ State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error },
-/* StartObject */new[]{ State.ObjectStart, State.ObjectStart, State.Error, State.Error, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.Error, State.Error },
-/* StartArray */new[]{ State.ArrayStart, State.ArrayStart, State.Error, State.Error, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.Error, State.Error },
-/* StartConstructor */new[]{ State.ConstructorStart, State.ConstructorStart, State.Error, State.Error, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.Error, State.Error },
-/* StartProperty */new[]{ State.Property, State.Error, State.Property, State.Property, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error },
-/* Comment */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error },
-/* Raw */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error },
-/* Value */new[]{ State.Start, State.Object, State.Error, State.Error, State.Array, State.Array, State.Constructor, State.Constructor, State.Error, State.Error },
+/* None */new[]{ State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error },
+/* StartObject */new[]{ State.ObjectStart, State.ObjectStart, State.Error, State.Error, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.Error, State.Error },
+/* StartArray */new[]{ State.ArrayStart, State.ArrayStart, State.Error, State.Error, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.Error, State.Error },
+/* StartConstructor */new[]{ State.ConstructorStart, State.ConstructorStart, State.Error, State.Error, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.Error, State.Error },
+/* StartProperty */new[]{ State.Property, State.Error, State.Property, State.Property, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error },
+/* Comment */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error },
+/* Raw */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error },
+/* Value (this will be copied) */new[]{ State.Start, State.Object, State.Error, State.Error, State.Array, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }
};
+ internal static State[][] BuildStateArray()
+ {
+ var allStates = StateArrayTempate.ToList();
+ var errorStates = StateArrayTempate[0];
+ var valueStates = StateArrayTempate[7];
+
+ foreach (JsonToken valueToken in EnumUtils.GetValues(typeof(JsonToken)))
+ {
+ if (allStates.Count <= (int)valueToken)
+ {
+ switch (valueToken)
+ {
+ case JsonToken.Integer:
+ case JsonToken.Float:
+ case JsonToken.String:
+ case JsonToken.Boolean:
+ case JsonToken.Null:
+ case JsonToken.Undefined:
+ case JsonToken.Date:
+ case JsonToken.Bytes:
+ allStates.Add(valueStates);
+ break;
+ default:
+ allStates.Add(errorStates);
+ break;
+ }
+ }
+ }
+
+ return allStates.ToArray();
+ }
+
+ static JsonWriter()
+ {
+ StateArray = BuildStateArray();
+ }
+
private int _top;
private readonly List _stack;
@@ -583,31 +623,11 @@ namespace Newtonsoft.Json
internal void AutoComplete(JsonToken tokenBeingWritten)
{
- int token;
-
- switch (tokenBeingWritten)
- {
- default:
- token = (int)tokenBeingWritten;
- break;
- case JsonToken.Integer:
- case JsonToken.Float:
- case JsonToken.String:
- case JsonToken.Boolean:
- case JsonToken.Null:
- case JsonToken.Undefined:
- case JsonToken.Date:
- case JsonToken.Bytes:
- // a value is being written
- token = 7;
- break;
- }
-
// gets new state based on the current state and what is being written
- State newState = stateArray[token][(int)_currentState];
+ State newState = StateArray[(int)tokenBeingWritten][(int)_currentState];
if (newState == State.Error)
- throw new JsonWriterException("Token {0} in state {1} would result in an invalid JavaScript object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()));
+ throw new JsonWriterException("Token {0} in state {1} would result in an invalid JSON object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()));
if ((_currentState == State.Object || _currentState == State.Array || _currentState == State.Constructor) && tokenBeingWritten != JsonToken.Comment)
{
diff --git a/Src/Newtonsoft.Json/Schema/JsonSchemaModelBuilder.cs b/Src/Newtonsoft.Json/Schema/JsonSchemaModelBuilder.cs
index ba3c7505..f126b9aa 100644
--- a/Src/Newtonsoft.Json/Schema/JsonSchemaModelBuilder.cs
+++ b/Src/Newtonsoft.Json/Schema/JsonSchemaModelBuilder.cs
@@ -157,12 +157,12 @@ namespace Newtonsoft.Json.Schema
model.PatternProperties[property.Key] = BuildNodeModel(property.Value);
}
- for (int i = 0; i < node.Items.Count; i++)
+ foreach (JsonSchemaNode t in node.Items)
{
if (model.Items == null)
model.Items = new List();
- model.Items.Add(BuildNodeModel(node.Items[i]));
+ model.Items.Add(BuildNodeModel(t));
}
if (node.AdditionalProperties != null)
model.AdditionalProperties = BuildNodeModel(node.AdditionalProperties);
diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
index b3a5fb27..6e2a474d 100644
--- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
+++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
@@ -594,7 +594,7 @@ namespace Newtonsoft.Json.Serialization
JsonISerializableContract contract = new JsonISerializableContract(objectType);
InitializeContract(contract);
- ConstructorInfo constructorInfo = objectType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);
+ ConstructorInfo constructorInfo = contract.NonNullableUnderlyingType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);
if (constructorInfo != null)
{
MethodCall