Merge branch 'master' of https://github.com/JamesNK/Newtonsoft.Json
This commit is contained in:
@@ -882,6 +882,63 @@ namespace Newtonsoft.Json.Tests.Bson
|
||||
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
|
||||
Assert.IsNull(reader.ReadAsBytes());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteEndOnProperty()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
BsonWriter writer = new BsonWriter(ms);
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
writer.WriteEnd();
|
||||
|
||||
Assert.AreEqual("0B-00-00-00-0A-42-6C-61-68-00-00", (BitConverter.ToString(ms.ToArray())));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteEndOnProperty_Close()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
BsonWriter writer = new BsonWriter(ms);
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
writer.Close();
|
||||
|
||||
Assert.AreEqual("0B-00-00-00-0A-42-6C-61-68-00-00", (BitConverter.ToString(ms.ToArray())));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteEndOnProperty_Dispose()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
using (BsonWriter writer = new BsonWriter(ms))
|
||||
{
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
}
|
||||
|
||||
Assert.AreEqual("0B-00-00-00-0A-42-6C-61-68-00-00", (BitConverter.ToString(ms.ToArray())));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AutoCompleteOnClose_False()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
using (BsonWriter writer = new BsonWriter(ms))
|
||||
{
|
||||
writer.AutoCompleteOnClose = false;
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
|
||||
writer.Flush();
|
||||
}
|
||||
|
||||
// nothing is written because a BSON document needs to be completed before it can be written
|
||||
Assert.AreEqual(string.Empty, (BitConverter.ToString(ms.ToArray())));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -2913,6 +2913,47 @@ namespace Newtonsoft.Json.Tests.Converters
|
||||
var deserialized = JsonConvert.DeserializeObject<XDocument>(json);
|
||||
Assert.AreEqual(@"<MyElement xmlns=""http://example.com"" />", deserialized.ToString());
|
||||
}
|
||||
|
||||
public class Model
|
||||
{
|
||||
public XElement Document { get; set; }
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DeserializeDateInElementText()
|
||||
{
|
||||
Model model = new Model();
|
||||
model.Document = new XElement("Value", new XAttribute("foo", "bar"))
|
||||
{
|
||||
Value = "2001-01-01T11:11:11"
|
||||
};
|
||||
|
||||
var serializer = JsonSerializer.Create(new JsonSerializerSettings
|
||||
{
|
||||
Converters = new List<JsonConverter>(new[] { new XmlNodeConverter() })
|
||||
});
|
||||
|
||||
var json = new StringBuilder(1024);
|
||||
|
||||
using (var stringWriter = new StringWriter(json, CultureInfo.InvariantCulture))
|
||||
using (var jsonWriter = new JsonTextWriter(stringWriter))
|
||||
{
|
||||
jsonWriter.Formatting = Formatting.None;
|
||||
serializer.Serialize(jsonWriter, model);
|
||||
|
||||
Assert.AreEqual(@"{""Document"":{""Value"":{""@foo"":""bar"",""#text"":""2001-01-01T11:11:11""}}}", json.ToString());
|
||||
}
|
||||
|
||||
using (var stringReader = new StringReader(json.ToString()))
|
||||
using (var jsonReader = new JsonTextReader(stringReader))
|
||||
{
|
||||
var document = (XDocument)serializer.Deserialize(jsonReader, typeof(XDocument));
|
||||
|
||||
StringAssert.AreEqual(@"<Document>
|
||||
<Value foo=""bar"">2001-01-01T11:11:11</Value>
|
||||
</Document>", document.ToString());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1310,6 +1310,51 @@ _____'propertyName': NaN,
|
||||
Assert.AreEqual("{'Blah':null}", sw.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteEndOnProperty_Close()
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
JsonTextWriter writer = new JsonTextWriter(sw);
|
||||
writer.QuoteChar = '\'';
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
writer.Close();
|
||||
|
||||
Assert.AreEqual("{'Blah':null}", sw.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteEndOnProperty_Dispose()
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
using (JsonTextWriter writer = new JsonTextWriter(sw))
|
||||
{
|
||||
writer.QuoteChar = '\'';
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
}
|
||||
|
||||
Assert.AreEqual("{'Blah':null}", sw.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AutoCompleteOnClose_False()
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
using (JsonTextWriter writer = new JsonTextWriter(sw))
|
||||
{
|
||||
writer.AutoCompleteOnClose = false;
|
||||
writer.QuoteChar = '\'';
|
||||
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("Blah");
|
||||
}
|
||||
|
||||
Assert.AreEqual("{'Blah':", sw.ToString());
|
||||
}
|
||||
|
||||
#if !NET20
|
||||
[Test]
|
||||
public void QuoteChar()
|
||||
|
||||
@@ -556,6 +556,31 @@ Parameter name: index");
|
||||
Assert.AreEqual(3, (int)a[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContentJustComments()
|
||||
{
|
||||
string json = @"[1,2,3]/*comment*/
|
||||
//Another comment.";
|
||||
|
||||
JArray a = JArray.Parse(json);
|
||||
|
||||
Assert.AreEqual(3, a.Count);
|
||||
Assert.AreEqual(1, (int)a[0]);
|
||||
Assert.AreEqual(2, (int)a[1]);
|
||||
Assert.AreEqual(3, (int)a[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContent()
|
||||
{
|
||||
string json = @"[1,2,3]/*comment*/
|
||||
//Another comment.
|
||||
[]";
|
||||
|
||||
ExceptionAssert.Throws<JsonReaderException>(() => JArray.Parse(json),
|
||||
"Additional text encountered after finished reading JSON content: [. Path '', line 3, position 0.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_LineInfo()
|
||||
{
|
||||
|
||||
@@ -1994,5 +1994,30 @@ Parameter name: arrayIndex");
|
||||
Assert.AreEqual(2, (int)o["prop"][1]);
|
||||
Assert.AreEqual(3, (int)o["prop"][2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContentJustComments()
|
||||
{
|
||||
string json = @"{'prop':[1,2,3]}/*comment*/
|
||||
//Another comment.";
|
||||
|
||||
JObject o = JObject.Parse(json);
|
||||
|
||||
Assert.AreEqual(3, o["prop"].Count());
|
||||
Assert.AreEqual(1, (int)o["prop"][0]);
|
||||
Assert.AreEqual(2, (int)o["prop"][1]);
|
||||
Assert.AreEqual(3, (int)o["prop"][2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContent()
|
||||
{
|
||||
string json = @"{'prop':[1,2,3]}/*comment*/
|
||||
//Another comment.
|
||||
[]";
|
||||
|
||||
ExceptionAssert.Throws<JsonReaderException>(() => JObject.Parse(json),
|
||||
"Additional text encountered after finished reading JSON content: [. Path '', line 3, position 0.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1264,5 +1264,30 @@ namespace Newtonsoft.Json.Tests.Linq
|
||||
Assert.AreEqual(2, (int)o["prop"][1]);
|
||||
Assert.AreEqual(3, (int)o["prop"][2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContentJustComments()
|
||||
{
|
||||
string json = @"{'prop':[1,2,3]}/*comment*/
|
||||
//Another comment.";
|
||||
|
||||
JToken o = JToken.Parse(json);
|
||||
|
||||
Assert.AreEqual(3, o["prop"].Count());
|
||||
Assert.AreEqual(1, (int)o["prop"][0]);
|
||||
Assert.AreEqual(2, (int)o["prop"][1]);
|
||||
Assert.AreEqual(3, (int)o["prop"][2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_ExcessiveContent()
|
||||
{
|
||||
string json = @"{'prop':[1,2,3]}/*comment*/
|
||||
//Another comment.
|
||||
{}";
|
||||
|
||||
ExceptionAssert.Throws<JsonReaderException>(() => JToken.Parse(json),
|
||||
"Additional text encountered after finished reading JSON content: {. Path '', line 3, position 0.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -274,7 +274,7 @@ namespace Newtonsoft.Json.Tests
|
||||
{
|
||||
var json = System.IO.File.ReadAllText("large.json");
|
||||
|
||||
BenchmarkDeserializeMethod<IList<RootObject>>(SerializeMethod.JsonNet, json, Iterations / 10, false);
|
||||
BenchmarkDeserializeMethod<IList<RootObject>>(SerializeMethod.JsonNet, json, Math.Min(Iterations, 10), false);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -8253,7 +8253,52 @@ lines.*/
|
||||
reader.Read();
|
||||
|
||||
serializer.Deserialize(reader, typeof(MyType));
|
||||
}, "Additional text found in JSON string after finishing deserializing object.");
|
||||
}, "Additional text found in JSON string after finishing deserializing object. Path '[1]', line 1, position 5.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AdditionalContentAfterFinishCheckNotRequested()
|
||||
{
|
||||
string json = @"{ ""MyProperty"":{""Key"":""Value""}} A bunch of junk at the end of the json";
|
||||
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
|
||||
var reader = new JsonTextReader(new StringReader(json));
|
||||
|
||||
MyType mt = (MyType)serializer.Deserialize(reader, typeof(MyType));
|
||||
Assert.AreEqual(1, mt.MyProperty.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AdditionalContentAfterCommentsCheckNotRequested()
|
||||
{
|
||||
string json = @"{ ""MyProperty"":{""Key"":""Value""}} /*this is a comment */
|
||||
// this is also a comment
|
||||
This is just junk, though.";
|
||||
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
|
||||
var reader = new JsonTextReader(new StringReader(json));
|
||||
|
||||
MyType mt = (MyType)serializer.Deserialize(reader, typeof(MyType));
|
||||
Assert.AreEqual(1, mt.MyProperty.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AdditionalContentAfterComments()
|
||||
{
|
||||
string json = @"[{ ""MyProperty"":{""Key"":""Value""}} /*this is a comment */
|
||||
// this is also a comment
|
||||
,{}";
|
||||
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
serializer.CheckAdditionalContent = true;
|
||||
var reader = new JsonTextReader(new StringReader(json));
|
||||
reader.Read();
|
||||
reader.Read();
|
||||
|
||||
ExceptionAssert.Throws<JsonSerializationException>(() => serializer.Deserialize(reader, typeof(MyType)),
|
||||
"Additional text found in JSON string after finishing deserializing object. Path '[1]', line 3, position 2.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -9044,6 +9089,119 @@ lines.*/
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_0 || NETSTANDARD1_1
|
||||
[Test]
|
||||
public void SerializeDictionaryWithStructKey_Custom()
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(
|
||||
new Dictionary<TypeConverterSize, TypeConverterSize> { { new TypeConverterSize(1, 2), new TypeConverterSize(3, 4) } }
|
||||
);
|
||||
|
||||
Assert.AreEqual(@"{""1, 2"":""3, 4""}", json);
|
||||
|
||||
Dictionary<TypeConverterSize, TypeConverterSize> d = JsonConvert.DeserializeObject<Dictionary<TypeConverterSize, TypeConverterSize>>(json);
|
||||
|
||||
Assert.AreEqual(new TypeConverterSize(1, 2), d.Keys.First());
|
||||
Assert.AreEqual(new TypeConverterSize(3, 4), d.Values.First());
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(TypeConverterSizeConverter))]
|
||||
public struct TypeConverterSize
|
||||
{
|
||||
public static readonly TypeConverterSize Empty;
|
||||
private int _width;
|
||||
private int _height;
|
||||
|
||||
public TypeConverterSize(int width, int height)
|
||||
{
|
||||
_width = width;
|
||||
_height = height;
|
||||
}
|
||||
|
||||
public int Width
|
||||
{
|
||||
get { return _width; }
|
||||
set { _width = value; }
|
||||
}
|
||||
|
||||
public int Height
|
||||
{
|
||||
get { return _height; }
|
||||
set { _height = value; }
|
||||
}
|
||||
}
|
||||
|
||||
public class TypeConverterSizeConverter : TypeConverter
|
||||
{
|
||||
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
||||
{
|
||||
return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
|
||||
}
|
||||
|
||||
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
|
||||
{
|
||||
return base.CanConvertTo(context, destinationType);
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
string str = value as string;
|
||||
if (str == null)
|
||||
{
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
string str2 = str.Trim();
|
||||
if (str2.Length == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (culture == null)
|
||||
{
|
||||
culture = CultureInfo.CurrentCulture;
|
||||
}
|
||||
string[] strArray = str2.Split(',');
|
||||
int[] numArray = new int[strArray.Length];
|
||||
TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
|
||||
for (int i = 0; i < numArray.Length; i++)
|
||||
{
|
||||
numArray[i] = (int)converter.ConvertFromString(context, culture, strArray[i]);
|
||||
}
|
||||
if (numArray.Length == 2)
|
||||
{
|
||||
return new TypeConverterSize(numArray[0], numArray[1]);
|
||||
}
|
||||
|
||||
throw new ArgumentException("Bad format.");
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is TypeConverterSize)
|
||||
{
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
TypeConverterSize size = (TypeConverterSize)value;
|
||||
if (culture == null)
|
||||
{
|
||||
culture = CultureInfo.CurrentCulture;
|
||||
}
|
||||
TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
|
||||
string[] strArray = new string[2];
|
||||
int num = 0;
|
||||
strArray[num++] = converter.ConvertToString(context, culture, size.Width);
|
||||
strArray[num++] = converter.ConvertToString(context, culture, size.Height);
|
||||
return string.Join(", ", strArray);
|
||||
}
|
||||
}
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
[Test]
|
||||
public void DeserializeCustomReferenceResolver()
|
||||
{
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
"System.Xml.XmlSerializer": "4.0.11",
|
||||
"System.Runtime.Serialization.Json": "4.0.2",
|
||||
"System.Runtime.Serialization.Xml": "4.1.1",
|
||||
"System.ComponentModel.TypeConverter": "4.1.0",
|
||||
"xunit": "2.1.0",
|
||||
"dotnet-test-xunit": "2.2.0-preview2-build1029"
|
||||
},
|
||||
|
||||
@@ -172,6 +172,7 @@ namespace Newtonsoft.Json.Bson
|
||||
/// <summary>
|
||||
/// Closes this writer.
|
||||
/// If <see cref="JsonWriter.CloseOutput"/> is set to <c>true</c>, the underlying <see cref="Stream"/> is also closed.
|
||||
/// If <see cref="JsonWriter.AutoCompleteOnClose"/> is set to <c>true</c>, the JSON is auto-completed.
|
||||
/// </summary>
|
||||
public override void Close()
|
||||
{
|
||||
|
||||
@@ -1652,8 +1652,6 @@ namespace Newtonsoft.Json.Converters
|
||||
|
||||
if (!string.IsNullOrEmpty(DeserializeRootElementName))
|
||||
{
|
||||
//rootNode = document.CreateElement(DeserializeRootElementName);
|
||||
//document.AppendChild(rootNode);
|
||||
ReadElement(reader, document, rootNode, DeserializeRootElementName, manager);
|
||||
}
|
||||
else
|
||||
@@ -1680,16 +1678,16 @@ namespace Newtonsoft.Json.Converters
|
||||
switch (propertyName)
|
||||
{
|
||||
case TextName:
|
||||
currentNode.AppendChild(document.CreateTextNode(reader.Value.ToString()));
|
||||
currentNode.AppendChild(document.CreateTextNode(ConvertTokenToXmlValue(reader)));
|
||||
break;
|
||||
case CDataName:
|
||||
currentNode.AppendChild(document.CreateCDataSection(reader.Value.ToString()));
|
||||
currentNode.AppendChild(document.CreateCDataSection(ConvertTokenToXmlValue(reader)));
|
||||
break;
|
||||
case WhitespaceName:
|
||||
currentNode.AppendChild(document.CreateWhitespace(reader.Value.ToString()));
|
||||
currentNode.AppendChild(document.CreateWhitespace(ConvertTokenToXmlValue(reader)));
|
||||
break;
|
||||
case SignificantWhitespaceName:
|
||||
currentNode.AppendChild(document.CreateSignificantWhitespace(reader.Value.ToString()));
|
||||
currentNode.AppendChild(document.CreateSignificantWhitespace(ConvertTokenToXmlValue(reader)));
|
||||
break;
|
||||
default:
|
||||
// processing instructions and the xml declaration start with ?
|
||||
@@ -2072,15 +2070,15 @@ namespace Newtonsoft.Json.Converters
|
||||
{
|
||||
case "@version":
|
||||
reader.Read();
|
||||
version = reader.Value.ToString();
|
||||
version = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
case "@encoding":
|
||||
reader.Read();
|
||||
encoding = reader.Value.ToString();
|
||||
encoding = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
case "@standalone":
|
||||
reader.Read();
|
||||
standalone = reader.Value.ToString();
|
||||
standalone = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
default:
|
||||
throw JsonSerializationException.Create(reader, "Unexpected property name encountered while deserializing XmlDeclaration: " + reader.Value);
|
||||
@@ -2092,7 +2090,7 @@ namespace Newtonsoft.Json.Converters
|
||||
}
|
||||
else
|
||||
{
|
||||
IXmlNode instruction = document.CreateProcessingInstruction(propertyName.Substring(1), reader.Value.ToString());
|
||||
IXmlNode instruction = document.CreateProcessingInstruction(propertyName.Substring(1), ConvertTokenToXmlValue(reader));
|
||||
currentNode.AppendChild(instruction);
|
||||
}
|
||||
}
|
||||
@@ -2109,19 +2107,19 @@ namespace Newtonsoft.Json.Converters
|
||||
{
|
||||
case "@name":
|
||||
reader.Read();
|
||||
name = reader.Value.ToString();
|
||||
name = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
case "@public":
|
||||
reader.Read();
|
||||
publicId = reader.Value.ToString();
|
||||
publicId = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
case "@system":
|
||||
reader.Read();
|
||||
systemId = reader.Value.ToString();
|
||||
systemId = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
case "@internalSubset":
|
||||
reader.Read();
|
||||
internalSubset = reader.Value.ToString();
|
||||
internalSubset = ConvertTokenToXmlValue(reader);
|
||||
break;
|
||||
default:
|
||||
throw JsonSerializationException.Create(reader, "Unexpected property name encountered while deserializing XmlDeclaration: " + reader.Value);
|
||||
|
||||
@@ -962,9 +962,15 @@ namespace Newtonsoft.Json
|
||||
{
|
||||
jsonSerializer.Populate(jsonReader, target);
|
||||
|
||||
if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment)
|
||||
if (settings != null && settings.CheckAdditionalContent)
|
||||
{
|
||||
throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object.");
|
||||
while (jsonReader.Read())
|
||||
{
|
||||
if (jsonReader.TokenType != JsonToken.Comment)
|
||||
{
|
||||
throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,6 +178,7 @@ namespace Newtonsoft.Json
|
||||
/// <summary>
|
||||
/// Closes this writer.
|
||||
/// If <see cref="JsonWriter.CloseOutput"/> is set to <c>true</c>, the underlying <see cref="TextWriter"/> is also closed.
|
||||
/// If <see cref="JsonWriter.AutoCompleteOnClose"/> is set to <c>true</c>, the JSON is auto-completed.
|
||||
/// </summary>
|
||||
public override void Close()
|
||||
{
|
||||
|
||||
@@ -126,6 +126,14 @@ namespace Newtonsoft.Json
|
||||
/// </value>
|
||||
public bool CloseOutput { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed.
|
||||
/// </summary>
|
||||
/// <value>
|
||||
/// <c>true</c> to auto-complete the JSON when this writer is closed; otherwise <c>false</c>. The default is <c>true</c>.
|
||||
/// </value>
|
||||
public bool AutoCompleteOnClose { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top.
|
||||
/// </summary>
|
||||
@@ -339,6 +347,7 @@ namespace Newtonsoft.Json
|
||||
_dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
|
||||
|
||||
CloseOutput = true;
|
||||
AutoCompleteOnClose = true;
|
||||
}
|
||||
|
||||
internal void UpdateScopeWithFinishedValue()
|
||||
@@ -393,11 +402,15 @@ namespace Newtonsoft.Json
|
||||
|
||||
/// <summary>
|
||||
/// Closes this writer.
|
||||
/// If <see cref="JsonWriter.CloseOutput"/> is set to <c>true</c>, the destination is also closed.
|
||||
/// If <see cref="CloseOutput"/> is set to <c>true</c>, the destination is also closed.
|
||||
/// If <see cref="AutoCompleteOnClose"/> is set to <c>true</c>, the JSON is auto-completed.
|
||||
/// </summary>
|
||||
public virtual void Close()
|
||||
{
|
||||
AutoCompleteAll();
|
||||
if (AutoCompleteOnClose)
|
||||
{
|
||||
AutoCompleteAll();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -176,9 +176,9 @@ namespace Newtonsoft.Json.Linq
|
||||
{
|
||||
JArray a = Load(reader, settings);
|
||||
|
||||
if (reader.Read() && reader.TokenType != JsonToken.Comment)
|
||||
while (reader.Read())
|
||||
{
|
||||
throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content.");
|
||||
// Any content encountered here other than a comment will throw in the reader.
|
||||
}
|
||||
|
||||
return a;
|
||||
|
||||
@@ -426,9 +426,9 @@ namespace Newtonsoft.Json.Linq
|
||||
{
|
||||
JObject o = Load(reader, settings);
|
||||
|
||||
if (reader.Read() && reader.TokenType != JsonToken.Comment)
|
||||
while (reader.Read())
|
||||
{
|
||||
throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content.");
|
||||
// Any content encountered here other than a comment will throw in the reader.
|
||||
}
|
||||
|
||||
return o;
|
||||
|
||||
@@ -2187,11 +2187,12 @@ namespace Newtonsoft.Json.Linq
|
||||
{
|
||||
JToken t = Load(reader, settings);
|
||||
|
||||
if (reader.Read() && reader.TokenType != JsonToken.Comment)
|
||||
while (reader.Read())
|
||||
{
|
||||
throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content.");
|
||||
// Any content encountered here other than a comment will throw in the reader.
|
||||
}
|
||||
|
||||
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ namespace Newtonsoft.Json.Linq
|
||||
|
||||
/// <summary>
|
||||
/// Closes this writer.
|
||||
/// If <see cref="JsonWriter.AutoCompleteOnClose"/> is set to <c>true</c>, the JSON is auto-completed.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Setting <see cref="JsonWriter.CloseOutput"/> to <c>true</c> has no additional effect, since the underlying <see cref="JContainer"/> is a type that cannot be closed.
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<DefineConstants>NET20;HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_DB_NULL_TYPE_CODE;HAVE_EMPTY_TYPES;HAVE_FULL_REFLECTION;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_MEMORY_BARRIER;
|
||||
HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_TRACE_WRITER;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_TRACE_WRITER;HAVE_TYPE_DESCRIPTOR;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<DefineConstants>NET35;HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_FULL_REFLECTION;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_LINQ;HAVE_MEMORY_BARRIER; HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_TIME_ZONE_INFO;HAVE_TRACE_WRITER;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
<DefineConstants>NET35;HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_FULL_REFLECTION;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_LINQ;HAVE_MEMORY_BARRIER;HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_TIME_ZONE_INFO;HAVE_TRACE_WRITER;HAVE_TYPE_DESCRIPTOR;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<DefineConstants>NET40;HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_BIG_INTEGER;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_CONCURRENT_COLLECTIONS;HAVE_COVARIANT_GENERICS;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_DYNAMIC;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_EXPRESSIONS;HAVE_FSHARP_TYPES;HAVE_FULL_REFLECTION;HAVE_GUID_TRY_PARSE;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_IGNORE_DATA_MEMBER_ATTRIBUTE;HAVE_INOTIFY_COLLECTION_CHANGED;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_ISET;HAVE_LINQ;HAVE_MEMORY_BARRIER;HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_SECURITY_SAFE_CRITICAL_ATTRIBUTE;HAVE_SERIALIZATION_BINDER_BIND_TO_NAME;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_STRING_JOIN_WITH_ENUMERABLE;HAVE_TIME_SPAN_PARSE_WITH_CULTURE;HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE;HAVE_TIME_ZONE_INFO;HAVE_TPL;HAVE_TRACE_WRITER;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_VARIANT_TYPE_PARAMETERS;HAVE_VERSION_TRY_PARSE;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
<DefineConstants>NET40;HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_BIG_INTEGER;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_CONCURRENT_COLLECTIONS;HAVE_COVARIANT_GENERICS;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_DYNAMIC;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_EXPRESSIONS;HAVE_FSHARP_TYPES;HAVE_FULL_REFLECTION;HAVE_GUID_TRY_PARSE;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_IGNORE_DATA_MEMBER_ATTRIBUTE;HAVE_INOTIFY_COLLECTION_CHANGED;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_ISET;HAVE_LINQ;HAVE_MEMORY_BARRIER;HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_REFLECTION_EMIT;HAVE_SECURITY_SAFE_CRITICAL_ATTRIBUTE;HAVE_SERIALIZATION_BINDER_BIND_TO_NAME;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_STRING_JOIN_WITH_ENUMERABLE;HAVE_TIME_SPAN_PARSE_WITH_CULTURE;HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE;HAVE_TIME_ZONE_INFO;HAVE_TPL;HAVE_TRACE_WRITER;HAVE_TYPE_DESCRIPTOR;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_VARIANT_TYPE_PARAMETERS;HAVE_VERSION_TRY_PARSE;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
<AssemblyName>Newtonsoft.Json</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<DefineConstants>HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_ASYNC;HAVE_BIG_INTEGER;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_CONCURRENT_COLLECTIONS;HAVE_COVARIANT_GENERICS;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_DYNAMIC;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_EXPRESSIONS;HAVE_FSHARP_TYPES;HAVE_FULL_REFLECTION;HAVE_GUID_TRY_PARSE;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_IGNORE_DATA_MEMBER_ATTRIBUTE;HAVE_IMMUTABLE_COLLECTIONS;HAVE_INOTIFY_COLLECTION_CHANGED;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_ISET;HAVE_LINQ;HAVE_MEMORY_BARRIER;HAVE_METHOD_IMPL_ATTRIBUTE;
|
||||
HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_READ_ONLY_COLLECTIONS;HAVE_REFLECTION_EMIT;HAVE_SECURITY_SAFE_CRITICAL_ATTRIBUTE;HAVE_SERIALIZATION_BINDER_BIND_TO_NAME;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_STRING_JOIN_WITH_ENUMERABLE;HAVE_TIME_SPAN_PARSE_WITH_CULTURE;HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE;HAVE_TIME_ZONE_INFO;HAVE_TPL;HAVE_TRACE_WRITER;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_VARIANT_TYPE_PARAMETERS;HAVE_VERSION_TRY_PARSE;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
<DefineConstants>HAVE_ADO_NET;HAVE_APP_DOMAIN;HAVE_ASYNC;HAVE_BIG_INTEGER;HAVE_BINARY_SERIALIZATION;HAVE_CAS;HAVE_CHAR_TO_LOWER_WITH_CULTURE;HAVE_CHAR_TO_STRING_WITH_CULTURE;HAVE_COM_ATTRIBUTES;HAVE_COMPONENT_MODEL;HAVE_CONCURRENT_COLLECTIONS;HAVE_COVARIANT_GENERICS;HAVE_DATA_CONTRACTS;HAVE_DATE_TIME_OFFSET;HAVE_DB_NULL_TYPE_CODE;HAVE_DYNAMIC;HAVE_EMPTY_TYPES;HAVE_ENTITY_FRAMEWORK;HAVE_EXPRESSIONS;HAVE_FSHARP_TYPES;HAVE_FULL_REFLECTION;HAVE_GUID_TRY_PARSE;HAVE_HASH_SET;HAVE_ICLONEABLE;HAVE_ICONVERTIBLE;HAVE_IGNORE_DATA_MEMBER_ATTRIBUTE;HAVE_IMMUTABLE_COLLECTIONS;HAVE_INOTIFY_COLLECTION_CHANGED;HAVE_INOTIFY_PROPERTY_CHANGING;HAVE_ISET;HAVE_LINQ;HAVE_MEMORY_BARRIER;HAVE_METHOD_IMPL_ATTRIBUTE;HAVE_NON_SERIALIZED_ATTRIBUTE;HAVE_READ_ONLY_COLLECTIONS;HAVE_REFLECTION_EMIT;HAVE_SECURITY_SAFE_CRITICAL_ATTRIBUTE;HAVE_SERIALIZATION_BINDER_BIND_TO_NAME;HAVE_STREAM_READER_WRITER_CLOSE;HAVE_STRING_JOIN_WITH_ENUMERABLE;HAVE_TIME_SPAN_PARSE_WITH_CULTURE;HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE;HAVE_TIME_ZONE_INFO;HAVE_TPL;HAVE_TRACE_WRITER;HAVE_TYPE_DESCRIPTOR;HAVE_UNICODE_SURROGATE_DETECTION;HAVE_VARIANT_TYPE_PARAMETERS;HAVE_VERSION_TRY_PARSE;HAVE_XLINQ;HAVE_XML_DOCUMENT</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
||||
@@ -1233,19 +1233,11 @@ namespace Newtonsoft.Json.Serialization
|
||||
|
||||
internal static bool CanConvertToString(Type type)
|
||||
{
|
||||
#if HAVE_COMPONENT_MODEL
|
||||
TypeConverter converter = ConvertUtils.GetConverter(type);
|
||||
|
||||
// use the objectType's TypeConverter if it has one and can convert to a string
|
||||
if (converter != null
|
||||
&& !(converter is ComponentConverter)
|
||||
&& !(converter is ReferenceConverter)
|
||||
&& converter.GetType() != typeof(TypeConverter))
|
||||
#if HAVE_TYPE_DESCRIPTOR
|
||||
TypeConverter converter;
|
||||
if (JsonTypeReflector.CanTypeDescriptorConvertString(type, out converter))
|
||||
{
|
||||
if (converter.CanConvertTo(typeof(string)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
{
|
||||
if (reader.TokenType != JsonToken.Comment)
|
||||
{
|
||||
throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object.");
|
||||
throw JsonSerializationException.Create(reader, "Additional text found in JSON string after finishing deserializing object.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -379,19 +379,12 @@ namespace Newtonsoft.Json.Serialization
|
||||
|
||||
internal static bool TryConvertToString(object value, Type type, out string s)
|
||||
{
|
||||
#if HAVE_COMPONENT_MODEL
|
||||
TypeConverter converter = ConvertUtils.GetConverter(type);
|
||||
|
||||
// use the objectType's TypeConverter if it has one and can convert to a string
|
||||
if (converter != null
|
||||
&& !(converter is ComponentConverter)
|
||||
&& converter.GetType() != typeof(TypeConverter))
|
||||
#if HAVE_TYPE_DESCRIPTOR
|
||||
TypeConverter converter;
|
||||
if (JsonTypeReflector.CanTypeDescriptorConvertString(type, out converter))
|
||||
{
|
||||
if (converter.CanConvertTo(typeof(string)))
|
||||
{
|
||||
s = converter.ConvertToInvariantString(value);
|
||||
return true;
|
||||
}
|
||||
s = converter.ConvertToInvariantString(value);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -69,6 +69,29 @@ namespace Newtonsoft.Json.Serialization
|
||||
return CachedAttributeGetter<T>.GetAttribute(attributeProvider);
|
||||
}
|
||||
|
||||
#if HAVE_TYPE_DESCRIPTOR
|
||||
public static bool CanTypeDescriptorConvertString(Type type, out TypeConverter typeConverter)
|
||||
{
|
||||
typeConverter = TypeDescriptor.GetConverter(type);
|
||||
|
||||
// use the objectType's TypeConverter if it has one and can convert to a string
|
||||
if (typeConverter != null)
|
||||
{
|
||||
Type converterType = typeConverter.GetType();
|
||||
|
||||
if (converterType.FullName != "System.ComponentModel.ComponentConverter"
|
||||
&& converterType.FullName != "System.ComponentModel.ReferenceConverter"
|
||||
&& converterType != typeof(TypeConverter))
|
||||
{
|
||||
return typeConverter.CanConvertTo(typeof(string));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_DATA_CONTRACTS
|
||||
public static DataContractAttribute GetDataContractAttribute(Type type)
|
||||
{
|
||||
@@ -245,13 +268,6 @@ namespace Newtonsoft.Json.Serialization
|
||||
};
|
||||
}
|
||||
|
||||
#if HAVE_COMPONENT_MODEL
|
||||
public static TypeConverter GetTypeConverter(Type type)
|
||||
{
|
||||
return TypeDescriptor.GetConverter(type);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(NET20 || DOTNET)
|
||||
private static Type GetAssociatedMetadataType(Type type)
|
||||
{
|
||||
|
||||
@@ -559,9 +559,9 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_COMPONENT_MODEL
|
||||
#if HAVE_TYPE_DESCRIPTOR
|
||||
// see if source or target types have a TypeConverter that converts between the two
|
||||
TypeConverter toConverter = GetConverter(initialType);
|
||||
TypeConverter toConverter = TypeDescriptor.GetConverter(initialType);
|
||||
|
||||
if (toConverter != null && toConverter.CanConvertTo(targetType))
|
||||
{
|
||||
@@ -569,7 +569,7 @@ namespace Newtonsoft.Json.Utilities
|
||||
return ConvertResult.Success;
|
||||
}
|
||||
|
||||
TypeConverter fromConverter = GetConverter(targetType);
|
||||
TypeConverter fromConverter = TypeDescriptor.GetConverter(targetType);
|
||||
|
||||
if (fromConverter != null && fromConverter.CanConvertFrom(initialType))
|
||||
{
|
||||
@@ -707,19 +707,12 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_COMPONENT_MODEL
|
||||
internal static TypeConverter GetConverter(Type t)
|
||||
{
|
||||
return JsonTypeReflector.GetTypeConverter(t);
|
||||
}
|
||||
#endif
|
||||
|
||||
public static bool VersionTryParse(string input, out Version result)
|
||||
{
|
||||
#if HAVE_VERSION_TRY_PARSE
|
||||
return Version.TryParse(input, out result);
|
||||
#else
|
||||
// improve failure performance with regex?
|
||||
// improve failure performance with regex?
|
||||
try
|
||||
{
|
||||
result = new Version(input);
|
||||
|
||||
@@ -172,6 +172,7 @@
|
||||
"HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE",
|
||||
"HAVE_TIME_ZONE_INFO",
|
||||
"HAVE_TPL",
|
||||
"HAVE_TYPE_DESCRIPTOR",
|
||||
"HAVE_UNICODE_SURROGATE_DETECTION",
|
||||
"HAVE_VARIANT_TYPE_PARAMETERS",
|
||||
"HAVE_VERSION_TRY_PARSE",
|
||||
@@ -181,6 +182,7 @@
|
||||
"dependencies": {
|
||||
"Microsoft.CSharp": "4.0.1",
|
||||
"System.Collections": "4.0.11",
|
||||
"System.ComponentModel.TypeConverter": "4.1.0",
|
||||
"System.Diagnostics.Debug": "4.0.11",
|
||||
"System.Dynamic.Runtime": "4.0.11",
|
||||
"System.Globalization": "4.0.11",
|
||||
@@ -232,6 +234,7 @@
|
||||
"HAVE_TIME_SPAN_TO_STRING_WITH_CULTURE",
|
||||
"HAVE_TIME_ZONE_INFO",
|
||||
"HAVE_TPL",
|
||||
"HAVE_TYPE_DESCRIPTOR",
|
||||
"HAVE_UNICODE_SURROGATE_DETECTION",
|
||||
"HAVE_VARIANT_TYPE_PARAMETERS",
|
||||
"HAVE_VERSION_TRY_PARSE",
|
||||
@@ -241,6 +244,7 @@
|
||||
"dependencies": {
|
||||
"Microsoft.CSharp": "4.0.1",
|
||||
"System.Collections": "4.0.11",
|
||||
"System.ComponentModel.TypeConverter": "4.1.0",
|
||||
"System.Diagnostics.Debug": "4.0.11",
|
||||
"System.Dynamic.Runtime": "4.0.11",
|
||||
"System.Globalization": "4.0.11",
|
||||
|
||||
Reference in New Issue
Block a user