Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/Newtonsoft.Json.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Newtonsoft.Json/JsonSerializer.cs')
-rw-r--r--Src/Newtonsoft.Json/JsonSerializer.cs90
1 files changed, 88 insertions, 2 deletions
diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs
index fbbc33a..4f01433 100644
--- a/Src/Newtonsoft.Json/JsonSerializer.cs
+++ b/Src/Newtonsoft.Json/JsonSerializer.cs
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Runtime.Serialization.Formatters;
using Newtonsoft.Json.Converters;
@@ -56,6 +57,10 @@ namespace Newtonsoft.Json
private IReferenceResolver _referenceResolver;
private SerializationBinder _binder;
private StreamingContext _context;
+ private Formatting? _formatting;
+ private DateFormatHandling? _dateFormatHandling;
+ private DateTimeZoneHandling? _dateTimeZoneHandling;
+ private CultureInfo _culture;
/// <summary>
/// Occurs when the <see cref="JsonSerializer"/> errors during serialization and deserialization.
@@ -279,6 +284,30 @@ namespace Newtonsoft.Json
get { return _context; }
set { _context = value; }
}
+
+ public virtual Formatting Formatting
+ {
+ get { return _formatting ?? JsonSerializerSettings.DefaultFormatting; }
+ set { _formatting = value; }
+ }
+
+ public virtual DateFormatHandling DateFormatHandling
+ {
+ get { return _dateFormatHandling ?? JsonSerializerSettings.DefaultDateFormatHandling; }
+ set { _dateFormatHandling = value; }
+ }
+
+ public virtual DateTimeZoneHandling DateTimeZoneHandling
+ {
+ get { return _dateTimeZoneHandling ?? JsonSerializerSettings.DefaultDateTimeZoneHandling; }
+ set { _dateTimeZoneHandling = value; }
+ }
+
+ public virtual CultureInfo Culture
+ {
+ get { return _culture ?? JsonSerializerSettings.DefaultCulture; }
+ set { _culture = value; }
+ }
#endregion
/// <summary>
@@ -295,7 +324,6 @@ namespace Newtonsoft.Json
_constructorHandling = JsonSerializerSettings.DefaultConstructorHandling;
_typeNameHandling = JsonSerializerSettings.DefaultTypeNameHandling;
_context = JsonSerializerSettings.DefaultContext;
-
_binder = DefaultSerializationBinder.Instance;
}
@@ -313,6 +341,7 @@ namespace Newtonsoft.Json
if (!CollectionUtils.IsNullOrEmpty(settings.Converters))
jsonSerializer.Converters.AddRange(settings.Converters);
+ // serializer specific
jsonSerializer.TypeNameHandling = settings.TypeNameHandling;
jsonSerializer.TypeNameAssemblyFormat = settings.TypeNameAssemblyFormat;
jsonSerializer.PreserveReferencesHandling = settings.PreserveReferencesHandling;
@@ -324,6 +353,13 @@ namespace Newtonsoft.Json
jsonSerializer.ConstructorHandling = settings.ConstructorHandling;
jsonSerializer.Context = settings.Context;
+ // reader specific
+ // unset values won't override reader set values
+ jsonSerializer._formatting = settings._formatting;
+ jsonSerializer._dateFormatHandling = settings._dateFormatHandling;
+ jsonSerializer._dateTimeZoneHandling = settings._dateTimeZoneHandling;
+ jsonSerializer._culture = settings._culture;
+
if (settings.Error != null)
jsonSerializer.Error += settings.Error;
@@ -417,8 +453,30 @@ namespace Newtonsoft.Json
{
ValidationUtils.ArgumentNotNull(reader, "reader");
+ // set serialization options onto reader
+ CultureInfo previousCulture = null;
+ if (_culture != null && reader.Culture != _culture)
+ {
+ previousCulture = reader.Culture;
+ reader.Culture = _culture;
+ }
+ DateTimeZoneHandling? previousDateTimeZoneHandling = null;
+ if (_dateTimeZoneHandling != null && reader.DateTimeZoneHandling != _dateTimeZoneHandling)
+ {
+ previousDateTimeZoneHandling = reader.DateTimeZoneHandling;
+ reader.DateTimeZoneHandling = _dateTimeZoneHandling.Value;
+ }
+
JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this);
- return serializerReader.Deserialize(reader, objectType);
+ object value = serializerReader.Deserialize(reader, objectType);
+
+ // reset reader back to previous options
+ if (previousCulture != null)
+ reader.Culture = previousCulture;
+ if (previousDateTimeZoneHandling != null)
+ reader.DateTimeZoneHandling = previousDateTimeZoneHandling.Value;
+
+ return value;
}
/// <summary>
@@ -447,8 +505,36 @@ namespace Newtonsoft.Json
{
ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter");
+ // set serialization options onto writer
+ Formatting? previousFormatting = null;
+ if (_formatting != null && jsonWriter.Formatting != _formatting)
+ {
+ previousFormatting = jsonWriter.Formatting;
+ jsonWriter.Formatting = _formatting.Value;
+ }
+ DateFormatHandling? previousDateFormatHandling = null;
+ if (_dateFormatHandling != null && jsonWriter.DateFormatHandling != _dateFormatHandling)
+ {
+ previousDateFormatHandling = jsonWriter.DateFormatHandling;
+ jsonWriter.DateFormatHandling = _dateFormatHandling.Value;
+ }
+ DateTimeZoneHandling? previousDateTimeZoneHandling = null;
+ if (_dateTimeZoneHandling != null && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling)
+ {
+ previousDateTimeZoneHandling = jsonWriter.DateTimeZoneHandling;
+ jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.Value;
+ }
+
JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(this);
serializerWriter.Serialize(jsonWriter, value);
+
+ // reset writer back to previous options
+ if (previousFormatting != null)
+ jsonWriter.Formatting = previousFormatting.Value;
+ if (previousDateFormatHandling != null)
+ jsonWriter.DateFormatHandling = previousDateFormatHandling.Value;
+ if (previousDateTimeZoneHandling != null)
+ jsonWriter.DateTimeZoneHandling = previousDateTimeZoneHandling.Value;
}
internal JsonConverter GetMatchingConverter(Type type)