Change - Heaps of small changes and bug fixes around LINQ to JSON. Many unit tests added.

Change - CultureInfo is now always passed into FormatWith
This commit is contained in:
JamesNK
2008-04-04 22:45:52 +00:00
parent e469918596
commit ffe2d91279
34 changed files with 1104 additions and 262 deletions
@@ -1,4 +1,29 @@
using System;
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -7,7 +32,7 @@ using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Utilities;
using System.Globalization;
namespace Newtonsoft.Json.Tests
namespace Newtonsoft.Json.Tests.Converters
{
public class IsoDateTimeConverterTests : TestFixtureBase
{
@@ -1,11 +1,36 @@
using System;
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Json.Converters;
namespace Newtonsoft.Json.Tests
namespace Newtonsoft.Json.Tests.Converters
{
public class JavaScriptDateTimeConverterTests : TestFixtureBase
{
@@ -31,7 +31,7 @@ using System.Xml;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Utilities;
namespace Newtonsoft.Json.Tests
namespace Newtonsoft.Json.Tests.Converters
{
public class XmlNodeConverterTest : TestFixtureBase
{
+26 -1
View File
@@ -1,4 +1,29 @@
using System;
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
-88
View File
@@ -1,88 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Json.Linq;
using System.Xml.Linq;
namespace Newtonsoft.Json.Tests
{
public class JTokenTests : TestFixtureBase
{
[Test]
public void Parent()
{
JValue v = new JValue(new DateTime(2000, 12, 20));
Assert.AreEqual(null, v.Parent);
JObject o =
new JObject(
new JProperty("Test1", v),
new JProperty("Test2", "Test2Value"),
new JProperty("Test3", "Test3Value"),
new JProperty("Test4", null)
);
Assert.AreEqual(o.Property("Test1"), v.Parent);
JProperty p = new JProperty("NewProperty", v);
// existing value should still have same parent
Assert.AreEqual(o.Property("Test1"), v.Parent);
// new value should be cloned
Assert.AreNotEqual(p.Value, v);
Assert.AreEqual((DateTime)p.Value, (DateTime)v.Value);
Assert.AreEqual(v, o["Test1"]);
XText t = new XText("XText");
Assert.AreEqual(null, t.Parent);
Assert.AreEqual(null, o.Parent);
JProperty o1 = new JProperty("O1", o);
Assert.AreEqual(o, o1.Value);
Assert.AreNotEqual(null, o.Parent);
JProperty o2 = new JProperty("O2", o);
Assert.AreNotEqual(o1.Value, o2.Value);
Assert.AreEqual(o1.Value.Children().Count(), o2.Value.Children().Count());
Assert.AreEqual(false, JToken.DeepEquals(o1, o2));
Assert.AreEqual(true, JToken.DeepEquals(o1.Value, o2.Value));
}
[Test]
public void Children()
{
JArray a =
new JArray(
5,
new JArray(1, 2, 3),
new JArray(1, 2, 3),
new JArray(1, 2, 3)
);
Assert.AreEqual(4, a.Count());
Assert.AreEqual(3, a.Children<JArray>().Count());
}
[Test]
public void Casting()
{
//JToken t = new JValue(new DateTime(2000, 12, 20));
//DateTime d = (DateTime)t;
Assert.AreEqual(new DateTime(2000, 12, 20), (DateTime)new JValue(new DateTime(2000, 12, 20)));
Assert.AreEqual(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero), (DateTimeOffset)new JValue(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero)));
Assert.AreEqual(true, (bool)new JValue(true));
Assert.AreEqual(true, (bool?)new JValue(true));
Assert.AreEqual(null, (bool?)((JValue)null));
Assert.AreEqual(null, (bool?)JValue.Null);
Assert.AreEqual(null, (bool?)JValue.Undefined);
}
}
}
@@ -1,3 +1,28 @@
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Text;
+26 -25
View File
@@ -147,6 +147,7 @@ namespace Newtonsoft.Json.Tests
}
}
[JsonObject]
public class ConverableMembers
{
public string String = "string";
@@ -165,6 +166,31 @@ namespace Newtonsoft.Json.Tests
public char Char = '\0';
}
[JsonObject(MemberSerialization.OptIn)]
public class JsonIgnoreAttributeOnClassTestClass
{
private int _property = 21;
private int _ignoredProperty = 12;
[JsonProperty("TheField")]
public int Field;
[JsonProperty]
public int Property
{
get { return _property; }
}
public int IgnoredField;
[JsonProperty]
[JsonIgnore] // JsonIgnore should take priority
public int IgnoredProperty
{
get { return _ignoredProperty; }
}
}
public class JsonSerializerTest : TestFixtureBase
{
[Test]
@@ -942,31 +968,6 @@ keyword such as type of business.""
Assert.AreEqual(StringComparison.CurrentCultureIgnoreCase, s);
}
[JsonObject(MemberSerialization.OptIn)]
public class JsonIgnoreAttributeOnClassTestClass
{
private int _property = 21;
private int _ignoredProperty = 12;
[JsonProperty("TheField")]
public int Field;
[JsonProperty]
public int Property
{
get { return _property; }
}
public int IgnoredField;
[JsonProperty]
[JsonIgnore] // JsonIgnore should take priority
public int IgnoredProperty
{
get { return _ignoredProperty; }
}
}
[Test]
public void JsonIgnoreAttributeOnClassTest()
{
@@ -207,7 +207,7 @@ namespace Newtonsoft.Json.Tests
{
string input = @"{
CPU: 'Intel',
Drives: [
Drives: [ /* Com*ment */
'DVD read/writer',
""500 gigabyte hard drive""
]
@@ -0,0 +1,467 @@
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Json.Linq;
using System.Xml.Linq;
namespace Newtonsoft.Json.Tests.Linq
{
public class JTokenTests : TestFixtureBase
{
[Test]
public void Parent()
{
JArray v = new JArray(new JConstructor("TestConstructor"), new JValue(new DateTime(2000, 12, 20)));
Assert.AreEqual(null, v.Parent);
JObject o =
new JObject(
new JProperty("Test1", v),
new JProperty("Test2", "Test2Value"),
new JProperty("Test3", "Test3Value"),
new JProperty("Test4", null)
);
Assert.AreEqual(o.Property("Test1"), v.Parent);
JProperty p = new JProperty("NewProperty", v);
// existing value should still have same parent
Assert.AreEqual(o.Property("Test1"), v.Parent);
// new value should be cloned
Assert.AreNotEqual(p.Value, v);
Assert.AreEqual((DateTime)((JValue)p.Value[1]).Value, (DateTime)((JValue)v[1]).Value);
Assert.AreEqual(v, o["Test1"]);
XText t = new XText("XText");
Assert.AreEqual(null, t.Parent);
Assert.AreEqual(null, o.Parent);
JProperty o1 = new JProperty("O1", o);
Assert.AreEqual(o, o1.Value);
Assert.AreNotEqual(null, o.Parent);
JProperty o2 = new JProperty("O2", o);
Assert.AreNotEqual(o1.Value, o2.Value);
Assert.AreEqual(o1.Value.Children().Count(), o2.Value.Children().Count());
Assert.AreEqual(false, JToken.DeepEquals(o1, o2));
Assert.AreEqual(true, JToken.DeepEquals(o1.Value, o2.Value));
}
[Test]
public void Next()
{
JArray a =
new JArray(
5,
6,
new JArray(7, 8),
new JArray(9, 10)
);
JToken next = a[0].Next;
Assert.AreEqual(6, (int)next);
next = next.Next;
Assert.IsTrue(JToken.DeepEquals(new JArray(7, 8), next));
next = next.Next;
Assert.IsTrue(JToken.DeepEquals(new JArray(9, 10), next));
next = next.Next;
Assert.IsNull(next);
}
[Test]
public void Previous()
{
JArray a =
new JArray(
5,
6,
new JArray(7, 8),
new JArray(9, 10)
);
JToken previous = a[3].Previous;
Assert.IsTrue(JToken.DeepEquals(new JArray(7, 8), previous));
previous = previous.Previous;
Assert.AreEqual(6, (int)previous);
previous = previous.Previous;
Assert.AreEqual(5, (int)previous);
previous = previous.Previous;
Assert.IsNull(previous);
}
[Test]
public void Children()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
Assert.AreEqual(4, a.Count());
Assert.AreEqual(3, a.Children<JArray>().Count());
}
[Test]
public void BeforeAfter()
{
JArray a =
new JArray(
5,
new JArray(1, 2, 3),
new JArray(1, 2, 3),
new JArray(1, 2, 3)
);
Assert.AreEqual(5, (int)a[1].Previous);
Assert.AreEqual(2, a[2].BeforeSelf().Count());
//Assert.AreEqual(2, a[2].AfterSelf().Count());
}
[Test]
public void Casting()
{
Assert.AreEqual(new DateTime(2000, 12, 20), (DateTime)new JValue(new DateTime(2000, 12, 20)));
Assert.AreEqual(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero), (DateTimeOffset)new JValue(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero)));
Assert.AreEqual(true, (bool)new JValue(true));
Assert.AreEqual(true, (bool?)new JValue(true));
Assert.AreEqual(null, (bool?)((JValue)null));
Assert.AreEqual(null, (bool?)JValue.Null);
Assert.AreEqual(null, (bool?)JValue.Undefined);
Assert.AreEqual(10, (long)new JValue(10));
Assert.AreEqual(null, (long?)new JValue((long?)null));
Assert.AreEqual(null, (long?)(JValue)null);
Assert.AreEqual(null, (int?)new JValue((int?)null));
Assert.AreEqual(null, (int?)(JValue)null);
Assert.AreEqual(null, (DateTime?)new JValue((DateTime?)null));
Assert.AreEqual(null, (DateTimeOffset?)new JValue((DateTimeOffset?)null));
Assert.AreEqual(null, (DateTime?)(JValue)null);
Assert.AreEqual(null, (DateTimeOffset?)(JValue)null);
Assert.AreEqual(null, (short?)new JValue((short?)null));
Assert.AreEqual(null, (short?)(JValue)null);
Assert.AreEqual(null, (float?)new JValue((float?)null));
Assert.AreEqual(null, (float?)(JValue)null);
Assert.AreEqual(null, (double?)new JValue((double?)null));
Assert.AreEqual(null, (double?)(JValue)null);
Assert.AreEqual(null, (decimal?)new JValue((decimal?)null));
Assert.AreEqual(null, (decimal?)(JValue)null);
Assert.AreEqual(null, (uint?)new JValue((uint?)null));
Assert.AreEqual(null, (uint?)(JValue)null);
Assert.AreEqual(null, (sbyte?)new JValue((sbyte?)null));
Assert.AreEqual(null, (sbyte?)(JValue)null);
Assert.AreEqual(null, (ulong?)new JValue((ulong?)null));
Assert.AreEqual(null, (ulong?)(JValue)null);
Assert.AreEqual(null, (uint?)new JValue((uint?)null));
Assert.AreEqual(null, (uint?)(JValue)null);
Assert.AreEqual(11.1f, (float)new JValue(11.1));
Assert.AreEqual(float.MinValue, (float)new JValue(float.MinValue));
Assert.AreEqual(1.1, (double)new JValue(1.1));
Assert.AreEqual(uint.MaxValue, (uint)new JValue(uint.MaxValue));
Assert.AreEqual(ulong.MaxValue, (ulong)new JValue(ulong.MaxValue));
Assert.AreEqual(ulong.MaxValue, (ulong)new JProperty("Test", new JValue(ulong.MaxValue)));
Assert.AreEqual(null, (string)new JValue((string)null));
}
[Test]
public void Root()
{
JArray a =
new JArray(
5,
6,
new JArray(7, 8),
new JArray(9, 10)
);
Assert.AreEqual(a, a.Root);
Assert.AreEqual(a, a[0].Root);
Assert.AreEqual(a, ((JArray)a[2])[0].Root);
}
[Test]
public void Remove()
{
JToken t;
JArray a =
new JArray(
5,
6,
new JArray(7, 8),
new JArray(9, 10)
);
a[0].Remove();
Assert.AreEqual(6, (int)a[0]);
a[1].Remove();
Assert.AreEqual(6, (int)a[0]);
Assert.IsTrue(JToken.DeepEquals(new JArray(9, 10), a[1]));
Assert.AreEqual(2, a.Count());
t = a[1];
t.Remove();
Assert.AreEqual(6, (int)a[0]);
Assert.IsNull(t.Next);
Assert.IsNull(t.Previous);
Assert.IsNull(t.Parent);
t = a[0];
t.Remove();
Assert.AreEqual(0, a.Count());
Assert.IsNull(t.Next);
Assert.IsNull(t.Previous);
Assert.IsNull(t.Parent);
}
[Test]
public void AfterSelf()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
JToken t = a[1];
List<JToken> afterTokens = t.AfterSelf().ToList();
Assert.AreEqual(2, afterTokens.Count);
Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2), afterTokens[0]));
Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), afterTokens[1]));
}
[Test]
public void BeforeSelf()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
JToken t = a[2];
List<JToken> beforeTokens = t.BeforeSelf().ToList();
Assert.AreEqual(2, beforeTokens.Count);
Assert.IsTrue(JToken.DeepEquals(new JValue(5), beforeTokens[0]));
Assert.IsTrue(JToken.DeepEquals(new JArray(1), beforeTokens[1]));
}
[Test]
public void HasValues()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
Assert.IsTrue(a.HasValues);
}
[Test]
public void Ancestors()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
JToken t = a[1][0];
List<JToken> ancestors = t.Ancestors().ToList();
Assert.AreEqual(2, ancestors.Count());
Assert.AreEqual(a[1], ancestors[0]);
Assert.AreEqual(a, ancestors[1]);
}
[Test]
public void Descendants()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
List<JToken> descendants = a.Descendants().ToList();
Assert.AreEqual(10, descendants.Count());
Assert.AreEqual(5, (int)descendants[0]);
Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), descendants[descendants.Count - 4]));
Assert.AreEqual(1, (int)descendants[descendants.Count - 3]);
Assert.AreEqual(2, (int)descendants[descendants.Count - 2]);
Assert.AreEqual(3, (int)descendants[descendants.Count - 1]);
}
[Test]
public void CreateWriter()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
JsonWriter writer = a.CreateWriter();
Assert.IsNotNull(writer);
Assert.AreEqual(4, a.Count());
writer.WriteValue("String");
Assert.AreEqual(5, a.Count());
Assert.AreEqual("String", (string)a[4]);
writer.WriteStartObject();
writer.WritePropertyName("Property");
writer.WriteValue("PropertyValue");
writer.WriteEnd();
Assert.AreEqual(6, a.Count());
Assert.IsTrue(JToken.DeepEquals(new JObject(new JProperty("Property", "PropertyValue")), a[5]));
}
[Test]
public void AddFirst()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
a.AddFirst("First");
Assert.AreEqual("First", (string)a[0]);
Assert.AreEqual(a, a[0].Parent);
Assert.AreEqual(a[1], a[0].Next);
Assert.AreEqual(5, a.Count());
a.AddFirst("NewFirst");
Assert.AreEqual("NewFirst", (string)a[0]);
Assert.AreEqual(a, a[0].Parent);
Assert.AreEqual(a[1], a[0].Next);
Assert.AreEqual(6, a.Count());
Assert.AreEqual(a[0], a[0].Next.Previous);
}
[Test]
public void RemoveAll()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
JToken first = a.First;
Assert.AreEqual(5, (int)first);
a.RemoveAll();
Assert.AreEqual(0, a.Count());
Assert.IsNull(first.Parent);
Assert.IsNull(first.Next);
}
[Test]
[ExpectedException(typeof(Exception), ExpectedMessage = "Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray")]
public void AddPropertyToArray()
{
JArray a = new JArray();
a.Add(new JProperty("PropertyName"));
}
[Test]
[ExpectedException(typeof(Exception), ExpectedMessage = "Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject")]
public void AddValueToObject()
{
JObject o = new JObject();
o.Add(5);
}
[Test]
public void Replace()
{
JArray a =
new JArray(
5,
new JArray(1),
new JArray(1, 2),
new JArray(1, 2, 3)
);
a[0].Replace(new JValue(int.MaxValue));
Assert.AreEqual(int.MaxValue, (int)a[0]);
Assert.AreEqual(4, a.Count());
a[1][0].Replace(new JValue("Test"));
Assert.AreEqual("Test", (string)a[1][0]);
a[2].Replace(new JValue(int.MaxValue));
Assert.AreEqual(int.MaxValue, (int)a[2]);
Assert.AreEqual(4, a.Count());
Assert.IsTrue(JToken.DeepEquals(new JArray(int.MaxValue, new JArray("Test"), int.MaxValue, new JArray(1, 2, 3)), a));
}
}
}
@@ -0,0 +1,164 @@
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Json.Linq;
namespace Newtonsoft.Json.Tests.Linq
{
public class JValueTests : TestFixtureBase
{
[Test]
public void ChangeValue()
{
JValue v = new JValue(true);
Assert.AreEqual(true, v.Value);
Assert.AreEqual(JsonTokenType.Boolean, v.Type);
v.Value = "Pie";
Assert.AreEqual("Pie", v.Value);
Assert.AreEqual(JsonTokenType.String, v.Type);
v.Value = null;
Assert.AreEqual(null, v.Value);
Assert.AreEqual(JsonTokenType.Null, v.Type);
v.Value = (int?)null;
Assert.AreEqual(null, v.Value);
Assert.AreEqual(JsonTokenType.Null, v.Type);
v.Value = "Pie";
Assert.AreEqual("Pie", v.Value);
Assert.AreEqual(JsonTokenType.String, v.Type);
}
[Test]
public void CreateComment()
{
JValue commentValue = JValue.CreateComment(null);
Assert.AreEqual(null, commentValue.Value);
Assert.AreEqual(JsonTokenType.Comment, commentValue.Type);
commentValue.Value = "Comment";
Assert.AreEqual("Comment", commentValue.Value);
Assert.AreEqual(JsonTokenType.Comment, commentValue.Type);
}
[Test]
public void CreateString()
{
JValue stringValue = JValue.CreateString(null);
Assert.AreEqual(null, stringValue.Value);
Assert.AreEqual(JsonTokenType.String, stringValue.Type);
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Cannot access child value on Newtonsoft.Json.Linq.JValue.")]
public void Last()
{
JValue v = new JValue(true);
JToken last = v.Last;
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Cannot access child value on Newtonsoft.Json.Linq.JValue.")]
public void Children()
{
JValue v = new JValue(true);
var c = v.Children();
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Cannot access child value on Newtonsoft.Json.Linq.JValue.")]
public void First()
{
JValue v = new JValue(true);
JToken first = v.First;
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Cannot access child value on Newtonsoft.Json.Linq.JValue.")]
public void Item()
{
JValue v = new JValue(true);
JToken first = v[0];
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Cannot access child value on Newtonsoft.Json.Linq.JValue.")]
public void Values()
{
JValue v = new JValue(true);
v.Values<int>();
}
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "The parent is missing.")]
public void RemoveParentNull()
{
JValue v = new JValue(true);
v.Remove();
}
[Test]
public void Root()
{
JValue v = new JValue(true);
Assert.AreEqual(v, v.Root);
}
[Test]
public void Previous()
{
JValue v = new JValue(true);
Assert.IsNull(v.Previous);
}
[Test]
public void Next()
{
JValue v = new JValue(true);
Assert.IsNull(v.Next);
}
[Test]
public void DeepEquals()
{
Assert.IsTrue(JToken.DeepEquals(new JValue(5L), new JValue(5)));
Assert.IsFalse(JToken.DeepEquals(new JValue(5M), new JValue(5)));
Assert.IsTrue(JToken.DeepEquals(new JValue((ulong)long.MaxValue), new JValue(long.MaxValue)));
}
[Test]
public void HasValues()
{
Assert.IsFalse((new JValue(5L)).HasValues);
}
}
}
@@ -33,7 +33,7 @@ using System.Xml;
using System.IO;
using Newtonsoft.Json.Converters;
namespace Newtonsoft.Json.Tests
namespace Newtonsoft.Json.Tests.Linq
{
public class LinqToJsonTest : TestFixtureBase
{
@@ -170,6 +170,13 @@ keyword such as type of business.""
List<JObject> resultObjects = o["results"].Children<JObject>().ToList();
Assert.AreEqual(32, resultObjects.Properties().Count());
Assert.AreEqual(32, resultObjects.Cast<JToken>().Values().Count());
Assert.AreEqual(4, resultObjects.Cast<JToken>().Values("GsearchResultClass").Count());
Assert.AreEqual(5, o.PropertyValues().Cast<JArray>().Children().Count());
List<string> resultUrls = o["results"].Children().Values<string>("url").ToList();
@@ -577,5 +584,42 @@ keyword such as type of business.""
Assert.IsInstanceOfType(typeof(JArray), a);
Assert.AreEqual(5, a.Count());
}
[Test]
public void FromAnonDictionary()
{
List<Post> posts = GetPosts();
JObject o = JObject.FromObject(new
{
channel = new Dictionary<string, object>
{
{ "title", "James Newton-King" },
{ "link", "http://james.newtonking.com" },
{ "description", "James Newton-King's blog." },
{ "item",
(from p in posts
orderby p.Title
select new
{
title = p.Title,
description = p.Description,
link = p.Link,
category = p.Categories
})
}
}
});
Console.WriteLine(o.ToString());
Assert.IsInstanceOfType(typeof(JObject), o);
Assert.IsInstanceOfType(typeof(JObject), o["channel"]);
Assert.AreEqual("James Newton-King", (string)o["channel"]["title"]);
Assert.AreEqual(2, o["channel"]["item"].Children().Count());
JArray a = JArray.FromObject(new List<int>() { 0, 1, 2, 3, 4 });
Assert.IsInstanceOfType(typeof(JArray), a);
Assert.AreEqual(5, a.Count());
}
}
}
@@ -70,19 +70,20 @@
</ItemGroup>
<ItemGroup>
<Compile Include="DateTimeTestClass.cs" />
<Compile Include="IsoDateTimeConverterTests.cs" />
<Compile Include="Converters\IsoDateTimeConverterTests.cs" />
<Compile Include="JavaScriptConvertTest.cs" />
<Compile Include="JavaScriptDateTimeConverterTests.cs" />
<Compile Include="Converters\JavaScriptDateTimeConverterTests.cs" />
<Compile Include="JsonSerializerTest.cs" />
<Compile Include="JsonTextReaderTest.cs" />
<Compile Include="JsonTextWriterTest.cs" />
<Compile Include="JsonTokenReaderTest.cs" />
<Compile Include="JsonTokenWriterTest.cs" />
<Compile Include="JTokenTests.cs" />
<Compile Include="LinqToJsonTest.cs" />
<Compile Include="Linq\JTokenTests.cs" />
<Compile Include="Linq\JValueTests.cs" />
<Compile Include="Linq\LinqToJsonTest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestFixtureBase.cs" />
<Compile Include="XmlNodeConverterTest.cs" />
<Compile Include="Converters\XmlNodeConverterTest.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Newtonsoft.Json\Newtonsoft.Json.csproj">
+26 -1
View File
@@ -1,4 +1,29 @@
using System;
#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -49,7 +49,7 @@ namespace Newtonsoft.Json.Converters
public override object ReadJson(JsonReader reader, Type objectType)
{
if (reader.TokenType != JsonToken.String)
throw new Exception("Unexpected token parsing date. Expected String, got {0}.".FormatWith(reader.TokenType));
throw new Exception("Unexpected token parsing date. Expected String, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
string dateText = reader.Value.ToString();
@@ -34,12 +34,12 @@ namespace Newtonsoft.Json.Converters
public override object ReadJson(JsonReader reader, Type objectType)
{
if (reader.TokenType != JsonToken.StartConstructor || string.Compare(reader.Value.ToString(), "Date", StringComparison.Ordinal) != 0)
throw new Exception("Unexpected token or value when parsing date. Token: {0}, Value: {1}".FormatWith(reader.TokenType, reader.Value));
throw new Exception("Unexpected token or value when parsing date. Token: {0}, Value: {1}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType, reader.Value));
reader.Read();
if (reader.TokenType != JsonToken.Integer)
throw new Exception("Unexpected token parsing date. Expected Integer, got {0}.".FormatWith(reader.TokenType));
throw new Exception("Unexpected token parsing date. Expected Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
long ticks = (long)reader.Value;
@@ -48,7 +48,7 @@ namespace Newtonsoft.Json.Converters
reader.Read();
if (reader.TokenType != JsonToken.EndConstructor)
throw new Exception("Unexpected token parsing date. Expected EndConstructor, got {0}.".FormatWith(reader.TokenType));
throw new Exception("Unexpected token parsing date. Expected EndConstructor, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
if (objectType == typeof(DateTimeOffset))
return new DateTimeOffset(d);
+1 -1
View File
@@ -384,7 +384,7 @@ namespace Newtonsoft.Json
return ToString((Guid)value);
}
throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(value.GetType()));
throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType()));
}
/// <summary>
+1 -1
View File
@@ -239,7 +239,7 @@ namespace Newtonsoft.Json
JsonTokenType currentObject = Pop();
if (GetTypeForCloseToken(endToken) != currentObject)
throw new JsonReaderException("JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(endToken, currentObject));
throw new JsonReaderException("JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, currentObject));
}
protected void SetStateBasedOnCurrent()
+5 -5
View File
@@ -290,7 +290,7 @@ namespace Newtonsoft.Json
return new DateTimeOffset((DateTime)value);
if (!targetType.IsAssignableFrom(valueType))
throw new InvalidOperationException("Cannot convert object of type '{0}' to type '{1}'".FormatWith(value.GetType(), targetType));
throw new InvalidOperationException("Cannot convert object of type '{0}' to type '{1}'".FormatWith(CultureInfo.InvariantCulture, value.GetType(), targetType));
return value;
}
@@ -369,7 +369,7 @@ namespace Newtonsoft.Json
private void SetObjectMember(JsonReader reader, object target, Type targetType, string memberName)
{
if (!reader.Read())
throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(memberName));
throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName));
MemberMappingCollection memberMappings = GetMemberMappings(targetType);
Type memberType;
@@ -413,7 +413,7 @@ namespace Newtonsoft.Json
else
{
if (_missingMemberHandling == MissingMemberHandling.Error)
throw new JsonSerializationException("Could not find member '{0}' on object of type '{1}'".FormatWith(memberName, targetType.GetType().Name));
throw new JsonSerializationException("Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, targetType.GetType().Name));
}
}
@@ -511,7 +511,7 @@ namespace Newtonsoft.Json
.SingleOrDefault();
if (!reader.Read())
throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(memberName));
throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName));
if (matchingConstructorParameter != null)
constructorParameters[matchingConstructorParameter] = CreateObject(reader, matchingConstructorParameter.ParameterType, null);
@@ -731,7 +731,7 @@ namespace Newtonsoft.Json
// continue
break;
default:
throw new InvalidOperationException("Unexpected ReferenceLoopHandling value: '{0}'".FormatWith(_referenceLoopHandling));
throw new InvalidOperationException("Unexpected ReferenceLoopHandling value: '{0}'".FormatWith(CultureInfo.InvariantCulture, _referenceLoopHandling));
}
}
+2 -1
View File
@@ -30,6 +30,7 @@ using System.IO;
using System.Xml;
using Newtonsoft.Json.Utilities;
using Newtonsoft.Json.Linq;
using System.Globalization;
namespace Newtonsoft.Json
{
@@ -513,7 +514,7 @@ namespace Newtonsoft.Json
State newState = stateArray[token, (int)_currentState];
if (newState == State.Error)
throw new JsonWriterException("Token {0} in state {1} would result in an invalid JavaScript object.".FormatWith(tokenBeingWritten.ToString(), _currentState.ToString()));
throw new JsonWriterException("Token {0} in state {1} would result in an invalid JavaScript object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()));
if ((_currentState == State.Object || _currentState == State.Array || _currentState == State.Constructor) && tokenBeingWritten != JsonToken.Comment)
{
+6 -1
View File
@@ -142,6 +142,11 @@ namespace Newtonsoft.Json.Linq
// return source.SelectMany(c => c.Children());
//}
public static IEnumerable<JToken> Children(this IEnumerable<JArray> source)
{
return Children<JToken>(source);
}
public static IEnumerable<U> Children<U>(this IEnumerable<JArray> source)
{
ValidationUtils.ArgumentNotNull(source, "source");
@@ -182,7 +187,7 @@ namespace Newtonsoft.Json.Linq
JValue value = token as JValue;
if (value == null)
throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(token.GetType(), typeof(T)));
throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(T)));
return (U)System.Convert.ChangeType(value.Value, typeof(U), CultureInfo.InvariantCulture);
}
+4 -3
View File
@@ -29,6 +29,7 @@ using System.Linq;
using System.Text;
using Newtonsoft.Json.Utilities;
using System.IO;
using System.Globalization;
namespace Newtonsoft.Json.Linq
{
@@ -109,7 +110,7 @@ namespace Newtonsoft.Json.Linq
ValidationUtils.ArgumentNotNull(o, "o");
if (o.Type == JsonTokenType.Property)
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(o.Type));
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(CultureInfo.InvariantCulture, o.Type));
}
public static JArray FromObject(object o)
@@ -117,7 +118,7 @@ namespace Newtonsoft.Json.Linq
JToken token = FromObjectInternal(o);
if (token.Type != JsonTokenType.Array)
throw new ArgumentException("Object serialized to {0}. JArray instance expected.".FormatWith(token.Type));
throw new ArgumentException("Object serialized to {0}. JArray instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type));
return (JArray)token;
}
@@ -141,7 +142,7 @@ namespace Newtonsoft.Json.Linq
ValidationUtils.ArgumentNotNull(key, "o");
if (!(key is int))
throw new ArgumentException("Accessed JArray values with invalid key value: {0}. Array position index expected.".FormatWith(MiscellaneousUtils.ToString(key)));
throw new ArgumentException("Accessed JArray values with invalid key value: {0}. Array position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key)));
return GetIndex(this, (int)key);
}
+4 -2
View File
@@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Utilities;
using System.Globalization;
namespace Newtonsoft.Json.Linq
{
@@ -53,6 +54,7 @@ namespace Newtonsoft.Json.Linq
public JConstructor(JConstructor other)
: base(other)
{
_name = other.Name;
}
public JConstructor(string name, params object[] content)
@@ -89,7 +91,7 @@ namespace Newtonsoft.Json.Linq
switch (o.Type)
{
case JsonTokenType.Property:
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(o.Type));
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(CultureInfo.InvariantCulture, o.Type));
}
}
@@ -112,7 +114,7 @@ namespace Newtonsoft.Json.Linq
ValidationUtils.ArgumentNotNull(key, "o");
if (!(key is int))
throw new ArgumentException("Accessed JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(MiscellaneousUtils.ToString(key)));
throw new ArgumentException("Accessed JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key)));
return GetIndex(this, (int)key);
}
+44 -30
View File
@@ -30,6 +30,7 @@ using System.Text;
using Newtonsoft.Json.Utilities;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
namespace Newtonsoft.Json.Linq
{
@@ -56,13 +57,18 @@ namespace Newtonsoft.Json.Linq
{
do
{
content = content.Next;
content = content._next;
Add(content.CloneNode());
}
while (content != other.Last);
}
}
public override bool HasValues
{
get { return (_content != null); }
}
internal bool ContentsEqual(JContainer container)
{
JToken t1 = First;
@@ -96,7 +102,7 @@ namespace Newtonsoft.Json.Linq
if (Last == null)
return null;
return Last.Next;
return Last._next;
}
}
@@ -121,7 +127,9 @@ namespace Newtonsoft.Json.Linq
do
{
yield return current;
} while ((current = current.Next) != first);
}
while (current != null
&& ((current = current.Next) != null));
}
public override IEnumerable<T> Values<T>()
@@ -178,14 +186,17 @@ namespace Newtonsoft.Json.Linq
return (content is IEnumerable && !(content is string));
}
public virtual void Add(object content)
internal void AddInternal(bool isLast, JToken previous, object content)
{
if (IsMultiContent(content))
{
IEnumerable enumerable = content as IEnumerable;
JToken multiPrevious = previous;
foreach (object c in enumerable)
{
Add(c);
AddInternal(isLast, multiPrevious, c);
multiPrevious = (previous != null) ? previous._next : Last;
}
}
else
@@ -211,46 +222,48 @@ namespace Newtonsoft.Json.Linq
}
}
JToken last = Last;
JToken next = First ?? o;
JToken next = (previous != null) ? previous._next : o;
o.Parent = this;
o.Next = next;
if (last != null)
last.Next = o;
_content = o;
if (previous != null)
previous.Next = o;
if (isLast)
_content = o;
}
}
internal virtual void ValidateToken(JToken o)
{
//throw new NotImplementedException();
ValidationUtils.ArgumentNotNull(o, "o");
if (o.Type == JsonTokenType.Property)
throw new Exception("Can not add {0} to {1}".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType()));
}
public virtual void Add(object content)
{
AddInternal(true, Last, content);
}
public void AddFirst(object content)
{
JToken o = CreateFromContent(content);
JToken last = Parent.Last;
o.Parent = Parent;
o.Next = last.Next;
last.Next = o;
AddInternal(false, Last, content);
}
protected JToken CreateFromContent(object content)
{
if (content is JToken)
return (JToken)content;
return new JValue(content);
else
return new JValue(content);
}
public JsonWriter CreateWriter()
{
return null;
return new JsonTokenWriter(this);
}
public void ReplaceAll(object content)
@@ -265,17 +278,17 @@ namespace Newtonsoft.Json.Linq
{
JToken o = _content;
JToken next = o.Next;
if (o != _content || next != o.Next)
JToken next = o._next;
if (o != _content || next != o._next)
throw new InvalidOperationException("This operation was corrupted by external code.");
if (next != o)
o.Next = next.Next;
o._next = next._next;
else
_content = null;
next.Parent = null;
next.Next = null;
next._next = null;
}
}
@@ -286,12 +299,13 @@ namespace Newtonsoft.Json.Linq
JToken content = _content;
while (_content.Next != o)
while (content._next != o)
{
content = content.Next;
content = content._next;
}
if (content == o)
{
// token is containers last child
_content = null;
}
else
@@ -300,7 +314,7 @@ namespace Newtonsoft.Json.Linq
{
_content = content;
}
content.Next = o.Next;
content._next = o._next;
}
o.Parent = null;
o.Next = null;
@@ -391,7 +405,7 @@ namespace Newtonsoft.Json.Linq
parent = property;
break;
default:
throw new InvalidOperationException("The JsonReader should not be on a token of type {0}.".FormatWith(r.TokenType));
throw new InvalidOperationException("The JsonReader should not be on a token of type {0}.".FormatWith(CultureInfo.InvariantCulture, r.TokenType));
}
}
while (r.Read());
+19 -10
View File
@@ -29,6 +29,7 @@ using System.Linq;
using System.Text;
using System.IO;
using Newtonsoft.Json.Utilities;
using System.Globalization;
namespace Newtonsoft.Json.Linq
{
@@ -59,6 +60,14 @@ namespace Newtonsoft.Json.Linq
return (t != null && ContentsEqual(t));
}
internal override void ValidateToken(JToken o)
{
ValidationUtils.ArgumentNotNull(o, "o");
if (o.Type != JsonTokenType.Property)
throw new Exception("Can not add {0} to {1}".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType()));
}
internal override JToken CloneNode()
{
return new JObject(this);
@@ -86,15 +95,15 @@ namespace Newtonsoft.Json.Linq
return new JEnumerable<JToken>(Properties().Select(p => p.Value));
}
public override void Add(object content)
{
ValidationUtils.ArgumentNotNull(content, "content");
//public override void Add(object content)
//{
// ValidationUtils.ArgumentNotNull(content, "content");
if (!(content is JProperty) && !IsMultiContent(content))
throw new ArgumentException("Error adding {0} to JObject. JObject only supports JProperty content.".FormatWith(content.GetType().Name));
// if (!(content is JProperty) && !IsMultiContent(content))
// throw new ArgumentException("Error adding {0} to JObject. JObject only supports JProperty content.".FormatWith(CultureInfo.InvariantCulture, content.GetType().Name));
base.Add(content);
}
// base.Add(content);
//}
public override JToken this[object key]
{
@@ -104,7 +113,7 @@ namespace Newtonsoft.Json.Linq
string propertyName = key as string;
if (propertyName == null)
throw new ArgumentException("Accessed JObject values with invalid key value: {0}. Object property name expected.".FormatWith(MiscellaneousUtils.ToString(key)));
throw new ArgumentException("Accessed JObject values with invalid key value: {0}. Object property name expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key)));
JProperty property = Property(propertyName);
@@ -149,7 +158,7 @@ namespace Newtonsoft.Json.Linq
JToken token = FromObjectInternal(o);
if (token.Type != JsonTokenType.Object)
throw new ArgumentException("Object serialized to {0}. JObject instance expected.".FormatWith(token.Type));
throw new ArgumentException("Object serialized to {0}. JObject instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type));
return (JObject)token;
}
@@ -159,7 +168,7 @@ namespace Newtonsoft.Json.Linq
ValidationUtils.ArgumentNotNull(o, "o");
if (o.Type != JsonTokenType.Property)
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(o.Type));
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(CultureInfo.InvariantCulture, o.Type));
}
public override void WriteTo(JsonWriter writer, params JsonConverter[] converters)
+17 -1
View File
@@ -29,6 +29,7 @@ using System.Linq;
using System.Text;
using Newtonsoft.Json.Utilities;
using System.Diagnostics;
using System.Globalization;
namespace Newtonsoft.Json.Linq
{
@@ -95,7 +96,7 @@ namespace Newtonsoft.Json.Linq
ValidationUtils.ArgumentNotNull(o, "o");
if (o.Type == JsonTokenType.Property)
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(o.Type));
throw new ArgumentException("An item of type {0} cannot be added to content.".FormatWith(CultureInfo.InvariantCulture, o.Type));
}
public override void WriteTo(JsonWriter writer, params JsonConverter[] converters)
@@ -103,5 +104,20 @@ namespace Newtonsoft.Json.Linq
writer.WritePropertyName(_name);
Value.WriteTo(writer, converters);
}
//public static explicit operator JValue(JProperty property)
//{
// if (property == null)
// return null;
// JToken value = property.Value;
// if (value == null)
// return null;
// if (!(value is JValue))
// throw new Exception("Could not cast {0} to JValue".FormatWith(CultureInfo.InvariantCulture, value.GetType()));
// return (JValue)value;
//}
}
}
+71 -41
View File
@@ -37,7 +37,7 @@ namespace Newtonsoft.Json.Linq
public abstract class JToken
{
private JContainer _parent;
private JToken _next;
internal JToken _next;
public JContainer Parent
{
@@ -48,13 +48,26 @@ namespace Newtonsoft.Json.Linq
public JToken Root
{
get { return null; }
get
{
JContainer parent = Parent;
if (parent == null)
return this;
while (parent.Parent != null)
{
parent = parent.Parent;
}
return parent;
}
}
internal abstract JToken CloneNode();
internal abstract bool DeepEquals(JToken node);
public abstract JsonTokenType Type { get; }
public abstract bool HasValues { get; }
public static bool DeepEquals(JToken t1, JToken t2)
{
@@ -65,10 +78,10 @@ namespace Newtonsoft.Json.Linq
{
get
{
if (_parent == null)
return null;
if (_parent != null && _next != _parent.First)
return _next;
return _next;
return null;
}
internal set { _next = value; }
}
@@ -80,7 +93,7 @@ namespace Newtonsoft.Json.Linq
if (_parent == null)
return null;
JToken parentNext = ((JToken)_parent.Content).Next;
JToken parentNext = ((JToken)_parent.Content)._next;
JToken parentNextBefore = null;
while (parentNext != this)
{
@@ -91,11 +104,6 @@ namespace Newtonsoft.Json.Linq
}
}
public bool HasValues
{
get { return false; }
}
public IEnumerable<JToken> Ancestors()
{
for (JToken parent = Parent; parent != null; parent = parent.Parent)
@@ -121,7 +129,7 @@ namespace Newtonsoft.Json.Linq
public virtual JToken this[object key]
{
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType())); }
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); }
}
public virtual T Value<T>(object key)
@@ -133,19 +141,19 @@ namespace Newtonsoft.Json.Linq
public virtual JToken First
{
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType())); }
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); }
//get { return null; }
}
public virtual JToken Last
{
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType())); }
get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); }
//get { return null; }
}
public virtual JEnumerable<JToken> Children()
{
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType()));
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
//return JEnumerable<JToken>.Empty;
}
@@ -156,12 +164,12 @@ namespace Newtonsoft.Json.Linq
public virtual IEnumerable<T> Values<T>()
{
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType()));
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
//public virtual IEnumerable<T> Children<T>()
// {
// throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(GetType()));
// throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
// //return Enumerable.Empty<T>();
// }
@@ -175,6 +183,23 @@ namespace Newtonsoft.Json.Linq
public void Replace(JToken value)
{
if (_parent == null)
throw new InvalidOperationException("The parent is missing.");
JContainer parent = _parent;
JToken previous = this;
while (previous._next != this)
{
previous = previous._next;
}
if (previous == this)
previous = null;
bool isLast = (this == _parent.Last);
Remove();
parent.AddInternal(isLast, previous, value);
}
public abstract void WriteTo(JsonWriter writer, params JsonConverter[] converters);
@@ -240,12 +265,17 @@ namespace Newtonsoft.Json.Linq
return (o.Type == JsonTokenType.String || IsNullable(o));
}
private static string GetType(JToken t)
{
return (t != null) ? t.Type.ToString() : "{null}";
}
#region Cast operators
public static explicit operator bool(JToken value)
{
JValue v = EnsureValue(value);
if (v == null || !ValidateBoolean(v, false))
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (bool)v.Value;
}
@@ -254,7 +284,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateDate(v, false))
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (DateTimeOffset)v.Value;
}
@@ -266,7 +296,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateBoolean(v, true))
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (bool?)v.Value;
}
@@ -275,7 +305,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, false))
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (long)v.Value;
}
@@ -287,7 +317,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateDate(v, true))
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (DateTime?)v.Value;
}
@@ -299,7 +329,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateDate(v, true))
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (DateTimeOffset?)v.Value;
}
@@ -311,7 +341,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, true))
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (decimal?)v.Value;
}
@@ -323,7 +353,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, true))
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (double?)v.Value;
}
@@ -332,7 +362,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, false))
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return Convert.ToInt32(v.Value, CultureInfo.InvariantCulture);
}
@@ -344,7 +374,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, true))
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (v.Value != null) ? (int?)Convert.ToInt32(v.Value, CultureInfo.InvariantCulture) : null;
}
@@ -353,7 +383,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateDate(v, false))
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (DateTime)v.Value;
}
@@ -365,7 +395,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, true))
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (long?)v.Value;
}
@@ -377,7 +407,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, true))
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (float?)v.Value;
}
@@ -386,7 +416,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, false))
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (decimal)v.Value;
}
@@ -398,7 +428,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, true))
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (uint?)v.Value;
}
@@ -410,7 +440,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, true))
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (ulong?)v.Value;
}
@@ -419,7 +449,7 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, false))
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (double)v.Value;
}
@@ -428,9 +458,9 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateFloat(v, false))
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (float)v.Value;
return Convert.ToSingle(v.Value, CultureInfo.InvariantCulture);
}
public static explicit operator string(JToken value)
@@ -440,7 +470,7 @@ namespace Newtonsoft.Json.Linq
JValue v = EnsureValue(value);
if (v == null || !ValidateString(v))
throw new ArgumentException("Can not convert {0} to String.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to String.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (string)v.Value;
}
@@ -449,18 +479,18 @@ namespace Newtonsoft.Json.Linq
{
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, false))
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (uint)v.Value;
return Convert.ToUInt32(v.Value, CultureInfo.InvariantCulture);
}
public static explicit operator ulong(JToken value)
{
JValue v = EnsureValue(value);
if (v == null || !ValidateInteger(v, false))
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(v.Type));
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(v)));
return (ulong)v.Value;
return Convert.ToUInt64(v.Value, CultureInfo.InvariantCulture);
}
#endregion
}
+51 -7
View File
@@ -56,6 +56,11 @@ namespace Newtonsoft.Json.Linq
{
}
public JValue(ulong value)
: this(value, JsonTokenType.Integer)
{
}
public JValue(double value)
: this(value, JsonTokenType.Float)
{
@@ -77,7 +82,7 @@ namespace Newtonsoft.Json.Linq
}
public JValue(object value)
: this(value, GetValueType(value))
: this(value, GetValueType(null, value))
{
}
@@ -87,7 +92,37 @@ namespace Newtonsoft.Json.Linq
if (other == null)
return false;
return (this == other || (_valueType == other.Type && _value == other.Value));
return (this == other || (_valueType == other.Type && Compare(_value, other.Value)));
}
public override bool HasValues
{
get { return false; }
}
public bool Compare(object objA, object objB)
{
if (objA == null && objB == null)
return true;
switch (_valueType)
{
case JsonTokenType.Integer:
if (objA is ulong || objB is ulong)
return Convert.ToDecimal(objA).Equals(Convert.ToDecimal(objB));
else
return Convert.ToInt64(objA).Equals(Convert.ToInt64(objB));
case JsonTokenType.Float:
return Convert.ToDouble(objA).Equals(Convert.ToDouble(objB));
case JsonTokenType.Comment:
case JsonTokenType.String:
case JsonTokenType.Boolean:
return objA.Equals(objB);
case JsonTokenType.Date:
return objA.Equals(objB);
default:
throw new ArgumentOutOfRangeException("valueType", _valueType, "Unexpected value type: {0}".FormatWith(CultureInfo.InvariantCulture, _valueType));
}
}
internal override JToken CloneNode()
@@ -100,12 +135,12 @@ namespace Newtonsoft.Json.Linq
return new JValue(value, JsonTokenType.Comment);
}
private static JsonTokenType GetValueType(object value)
private static JsonTokenType GetValueType(JsonTokenType? current, object value)
{
if (value == null)
return JsonTokenType.Null;
else if (value is string)
return JsonTokenType.String;
return (current == JsonTokenType.Comment) ? JsonTokenType.Comment : JsonTokenType.String;
else if (value is long || value is int || value is short || value is sbyte
|| value is ulong || value is uint || value is ushort || value is byte)
return JsonTokenType.Integer;
@@ -116,7 +151,7 @@ namespace Newtonsoft.Json.Linq
else if (value is bool)
return JsonTokenType.Boolean;
throw new ArgumentException("Could not determin JSON object type for type {0}.".FormatWith(value.GetType()));
throw new ArgumentException("Could not determin JSON object type for type {0}.".FormatWith(CultureInfo.InvariantCulture, value.GetType()));
}
public override JsonTokenType Type
@@ -127,10 +162,19 @@ namespace Newtonsoft.Json.Linq
public object Value
{
get { return _value; }
set { _value = value; }
set
{
Type currentType = (_value != null) ? _value.GetType() : null;
Type newType = (value != null) ? value.GetType() : null;
if (currentType != newType)
_valueType = GetValueType(_valueType, value);
_value = value;
}
}
public static JToken CreateString(string value)
public static JValue CreateString(string value)
{
return new JValue(value, JsonTokenType.String);
}
@@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel;
using Newtonsoft.Json.Utilities;
using System.Globalization;
namespace Newtonsoft.Json
{
@@ -51,7 +52,7 @@ namespace Newtonsoft.Json
if (!existingMemberMapping.Ignored)
{
throw new JsonSerializationException(
"A member with the name '{0}' already exists on {1}. Use the JsonPropertyAttribute to specify another name.".FormatWith(memberMapping.MappingName, memberMapping.Member.DeclaringType));
"A member with the name '{0}' already exists on {1}. Use the JsonPropertyAttribute to specify another name.".FormatWith(CultureInfo.InvariantCulture, memberMapping.MappingName, memberMapping.Member.DeclaringType));
}
else
{
@@ -30,6 +30,7 @@ using System.Reflection;
using System.Text;
using System.Collections;
using System.Linq;
using System.Globalization;
namespace Newtonsoft.Json.Utilities
{
@@ -315,7 +316,7 @@ namespace Newtonsoft.Json.Utilities
else if (returnDefaultIfEmpty && list.Count == 0)
return default(T);
else
throw new Exception("Expected single {0} in list but got {1}.".FormatWith(typeof(T), list.Count));
throw new Exception("Expected single {0} in list but got {1}.".FormatWith(CultureInfo.InvariantCulture, typeof(T), list.Count));
}
#endregion
@@ -389,7 +390,7 @@ namespace Newtonsoft.Json.Utilities
}
else
{
throw new Exception("Can not create ListWrapper for type {0}.".FormatWith(list.GetType()));
throw new Exception("Can not create ListWrapper for type {0}.".FormatWith(CultureInfo.InvariantCulture, list.GetType()));
}
}
@@ -418,7 +419,7 @@ namespace Newtonsoft.Json.Utilities
}
else
{
throw new Exception("Can not create DictionaryWrapper for type {0}.".FormatWith(dictionary.GetType()));
throw new Exception("Can not create DictionaryWrapper for type {0}.".FormatWith(CultureInfo.InvariantCulture, dictionary.GetType()));
}
}
@@ -459,7 +460,7 @@ namespace Newtonsoft.Json.Utilities
}
if (!suitableConstructor)
throw new Exception("Read-only type {0} does not have a public constructor that takes a type that implements {1}.".FormatWith(listType, genericEnumerable));
throw new Exception("Read-only type {0} does not have a public constructor that takes a type that implements {1}.".FormatWith(CultureInfo.InvariantCulture, listType, genericEnumerable));
// can't add or modify a readonly list
// use List<T> and convert once populated
@@ -485,7 +486,7 @@ namespace Newtonsoft.Json.Utilities
}
if (list == null)
throw new Exception("Cannot create and populate list type {0}.".FormatWith(listType));
throw new Exception("Cannot create and populate list type {0}.".FormatWith(CultureInfo.InvariantCulture, listType));
populateList(list);
+2 -1
View File
@@ -29,6 +29,7 @@ using System.Collections.Generic;
using System.Threading;
using Newtonsoft.Json.Utilities;
using System.Linq;
using System.Globalization;
namespace Newtonsoft.Json.Utilities
{
@@ -261,7 +262,7 @@ namespace Newtonsoft.Json.Utilities
private static void VerifyValueType(object value)
{
if (!IsCompatibleObject(value))
throw new ArgumentException("The value '{0}' is not of type '{1}' and cannot be used in this generic collection.".FormatWith(value, typeof(T)), "value");
throw new ArgumentException("The value '{0}' is not of type '{1}' and cannot be used in this generic collection.".FormatWith(CultureInfo.InvariantCulture, value, typeof(T)), "value");
}
private static bool IsCompatibleObject(object value)
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Text;
using System.Globalization;
namespace Newtonsoft.Json.Utilities
{
@@ -55,7 +56,7 @@ namespace Newtonsoft.Json.Utilities
if (descriptionAttribute != null)
return descriptionAttribute.Description;
else
throw new Exception("No DescriptionAttribute on '{0}'.".FormatWith(o.GetType()));
throw new Exception("No DescriptionAttribute on '{0}'.".FormatWith(CultureInfo.InvariantCulture, o.GetType()));
}
public static IList<string> GetDescriptions(IList values)
@@ -30,6 +30,7 @@ using System.Reflection;
using System.Collections;
using System.ComponentModel;
using System.Linq;
using System.Globalization;
namespace Newtonsoft.Json.Utilities
{
@@ -106,14 +107,14 @@ namespace Newtonsoft.Json.Utilities
ValidationUtils.ArgumentNotNull(type, "type");
if (type.IsGenericTypeDefinition)
throw new ArgumentException("Type {0} is a generic type definition and cannot be instantiated.".FormatWith(type), "type");
throw new ArgumentException("Type {0} is a generic type definition and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, type), "type");
if (type.IsClass || type.IsInterface || type == typeof(void))
return null;
else if (type.IsValueType)
return Activator.CreateInstance(type);
else
throw new ArgumentException("Type {0} cannot be instantiated.".FormatWith(type), "type");
throw new ArgumentException("Type {0} cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, type), "type");
}
public static bool IsPropertyIndexed(PropertyInfo property)
@@ -196,7 +197,7 @@ namespace Newtonsoft.Json.Utilities
else if (IsSubClass(type, typeof(IList<>), out genericListType))
{
if (genericListType.IsGenericTypeDefinition)
throw new Exception("Type {0} is not a list.".FormatWith(type));
throw new Exception("Type {0} is not a list.".FormatWith(CultureInfo.InvariantCulture, type));
return genericListType.GetGenericArguments()[0];
}
@@ -206,7 +207,7 @@ namespace Newtonsoft.Json.Utilities
}
else
{
throw new Exception("Type {0} is not a list.".FormatWith(type));
throw new Exception("Type {0} is not a list.".FormatWith(CultureInfo.InvariantCulture, type));
}
}
@@ -218,7 +219,7 @@ namespace Newtonsoft.Json.Utilities
if (IsSubClass(dictionaryType, typeof(IDictionary<,>), out genericDictionaryType))
{
if (genericDictionaryType.IsGenericTypeDefinition)
throw new Exception("Type {0} is not a dictionary.".FormatWith(dictionaryType));
throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType));
Type[] dictionaryGenericArguments = genericDictionaryType.GetGenericArguments();
@@ -234,7 +235,7 @@ namespace Newtonsoft.Json.Utilities
}
else
{
throw new Exception("Type {0} is not a dictionary.".FormatWith(dictionaryType));
throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType));
}
}
@@ -289,7 +290,7 @@ namespace Newtonsoft.Json.Utilities
}
else
{
throw new Exception("Type {0} is neither a ValueType or a Class.".FormatWith(elementType));
throw new Exception("Type {0} is neither a ValueType or a Class.".FormatWith(CultureInfo.InvariantCulture, elementType));
}
return true;
@@ -387,10 +388,10 @@ namespace Newtonsoft.Json.Utilities
}
catch (TargetParameterCountException e)
{
throw new ArgumentException("MemberInfo '{0}' has index parameters".FormatWith(member.Name), "member", e);
throw new ArgumentException("MemberInfo '{0}' has index parameters".FormatWith(CultureInfo.InvariantCulture, member.Name), "member", e);
}
default:
throw new ArgumentException("MemberInfo '{0}' is not of type FieldInfo or PropertyInfo".FormatWith(member.Name), "member");
throw new ArgumentException("MemberInfo '{0}' is not of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, CultureInfo.InvariantCulture, member.Name), "member");
}
}
@@ -414,7 +415,7 @@ namespace Newtonsoft.Json.Utilities
((PropertyInfo)member).SetValue(target, value, null);
break;
default:
throw new ArgumentException("MemberInfo '{0}' must be of type FieldInfo or PropertyInfo".FormatWith(member.Name), "member");
throw new ArgumentException("MemberInfo '{0}' must be of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, member.Name), "member");
}
}
@@ -526,7 +527,7 @@ namespace Newtonsoft.Json.Utilities
{
ValidationUtils.ArgumentNotNull(genericTypeDefinition, "genericTypeDefinition");
ValidationUtils.ArgumentNotNullOrEmpty<Type>(innerTypes, "innerTypes");
ValidationUtils.ArgumentConditionTrue(genericTypeDefinition.IsGenericTypeDefinition, "genericTypeDefinition", "Type {0} is not a generic type definition.".FormatWith(genericTypeDefinition));
ValidationUtils.ArgumentConditionTrue(genericTypeDefinition.IsGenericTypeDefinition, "genericTypeDefinition", "Type {0} is not a generic type definition.".FormatWith(CultureInfo.InvariantCulture, genericTypeDefinition));
return genericTypeDefinition.MakeGenericType(innerTypes);
}
+4 -4
View File
@@ -42,10 +42,10 @@ namespace Newtonsoft.Json.Utilities
public const char LineFeed = '\n';
public const char Tab = '\t';
public static string FormatWith(this string format, params object[] args)
{
return FormatWith(format, CultureInfo.InvariantCulture, args);
}
//public static string FormatWith(this string format, params object[] args)
//{
// return FormatWith(format, null, args);
//}
public static string FormatWith(this string format, IFormatProvider provider, params object[] args)
{
@@ -27,6 +27,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
namespace Newtonsoft.Json.Utilities
{
@@ -44,7 +45,7 @@ namespace Newtonsoft.Json.Utilities
throw new ArgumentNullException(parameterName);
if (value.Length == 0)
throw new ArgumentException("'{0}' cannot be empty.".FormatWith(parameterName), parameterName);
throw new ArgumentException("'{0}' cannot be empty.".FormatWith(CultureInfo.InvariantCulture, parameterName), parameterName);
}
public static void ArgumentNotNullOrEmptyOrWhitespace(string value, string parameterName)
@@ -52,7 +53,7 @@ namespace Newtonsoft.Json.Utilities
ArgumentNotNullOrEmpty(value, parameterName);
if (StringUtils.IsWhiteSpace(value))
throw new ArgumentException("'{0}' cannot only be whitespace.".FormatWith(parameterName), parameterName);
throw new ArgumentException("'{0}' cannot only be whitespace.".FormatWith(CultureInfo.InvariantCulture, parameterName), parameterName);
}
public static void ArgumentTypeIsEnum(Type enumType, string parameterName)
@@ -60,12 +61,12 @@ namespace Newtonsoft.Json.Utilities
ArgumentNotNull(enumType, "enumType");
if (!enumType.IsEnum)
throw new ArgumentException("Type {0} is not an Enum.".FormatWith(enumType), parameterName);
throw new ArgumentException("Type {0} is not an Enum.".FormatWith(CultureInfo.InvariantCulture, enumType), parameterName);
}
public static void ArgumentNotNullOrEmpty<T>(ICollection<T> collection, string parameterName)
{
ArgumentNotNullOrEmpty<T>(collection, parameterName, "Collection '{0}' cannot be empty.".FormatWith(parameterName));
ArgumentNotNullOrEmpty<T>(collection, parameterName, "Collection '{0}' cannot be empty.".FormatWith(CultureInfo.InvariantCulture, parameterName));
}
public static void ArgumentNotNullOrEmpty<T>(ICollection<T> collection, string parameterName, string message)
@@ -79,7 +80,7 @@ namespace Newtonsoft.Json.Utilities
public static void ArgumentNotNullOrEmpty(ICollection collection, string parameterName)
{
ArgumentNotNullOrEmpty(collection, parameterName, "Collection '{0}' cannot be empty.".FormatWith(parameterName));
ArgumentNotNullOrEmpty(collection, parameterName, "Collection '{0}' cannot be empty.".FormatWith(CultureInfo.InvariantCulture, parameterName));
}
public static void ArgumentNotNullOrEmpty(ICollection collection, string parameterName, string message)