-Fixed TypeNameHandling.Auto with some JsonConverters
-Fixed TypeNameHandling.Auto with JsonSerializer.Serialize inside a JsonConverter -Changed assembly version to 6.0.0.0 -Marked async methods on JsonConverter as obsolete
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
||||
properties {
|
||||
$zipFileName = "Json60r1.zip"
|
||||
$majorVersion = "4.5"
|
||||
$majorVersion = "6.0"
|
||||
$majorWithReleaseVersion = "6.0.1"
|
||||
$version = GetVersion $majorWithReleaseVersion
|
||||
$signAssemblies = $false
|
||||
|
||||
@@ -74,5 +74,5 @@ using System.Security;
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly: AssemblyVersion("4.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("6.0.1.16919")]
|
||||
[assembly: AssemblyVersion("6.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("6.0.1.16929")]
|
||||
|
||||
@@ -7341,7 +7341,7 @@ Parameter name: value",
|
||||
|
||||
JsonSerializer serializer = new JsonSerializer();
|
||||
MultipleItemsClass foo = serializer.Deserialize<MultipleItemsClass>(reader);
|
||||
|
||||
|
||||
values.Add(foo);
|
||||
}
|
||||
|
||||
@@ -8775,7 +8775,7 @@ Parameter name: value",
|
||||
ExtensionDataDeserializeWithNonDefaultConstructor c = new ExtensionDataDeserializeWithNonDefaultConstructor("Name!");
|
||||
c._extensionData = new Dictionary<string, JToken>
|
||||
{
|
||||
{"Key!", "Value!"}
|
||||
{ "Key!", "Value!" }
|
||||
};
|
||||
|
||||
string json = JsonConvert.SerializeObject(c, Formatting.Indented);
|
||||
|
||||
@@ -54,6 +54,61 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
[TestFixture]
|
||||
public class TypeNameHandlingTests : TestFixtureBase
|
||||
{
|
||||
[Test]
|
||||
public void DictionaryAuto()
|
||||
{
|
||||
Dictionary<string, object> dic = new Dictionary<string, object>
|
||||
{
|
||||
{ "movie", new Movie { Name = "Die Hard"}}
|
||||
};
|
||||
|
||||
string json = JsonConvert.SerializeObject(dic, Formatting.Indented, new JsonSerializerSettings
|
||||
{
|
||||
TypeNameHandling = TypeNameHandling.Auto
|
||||
});
|
||||
|
||||
Assert.AreEqual(@"{
|
||||
""movie"": {
|
||||
""$type"": ""Newtonsoft.Json.Tests.TestObjects.Movie, Newtonsoft.Json.Tests"",
|
||||
""Name"": ""Die Hard"",
|
||||
""Description"": null,
|
||||
""Classification"": null,
|
||||
""Studio"": null,
|
||||
""ReleaseDate"": null,
|
||||
""ReleaseCountries"": null
|
||||
}
|
||||
}", json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void KeyValuePairAuto()
|
||||
{
|
||||
IList<KeyValuePair<string, object>> dic = new List<KeyValuePair<string, object>>
|
||||
{
|
||||
new KeyValuePair<string, object>("movie", new Movie { Name = "Die Hard"})
|
||||
};
|
||||
|
||||
string json = JsonConvert.SerializeObject(dic, Formatting.Indented, new JsonSerializerSettings
|
||||
{
|
||||
TypeNameHandling = TypeNameHandling.Auto
|
||||
});
|
||||
|
||||
Assert.AreEqual(@"[
|
||||
{
|
||||
""Key"": ""movie"",
|
||||
""Value"": {
|
||||
""$type"": ""Newtonsoft.Json.Tests.TestObjects.Movie, Newtonsoft.Json.Tests"",
|
||||
""Name"": ""Die Hard"",
|
||||
""Description"": null,
|
||||
""Classification"": null,
|
||||
""Studio"": null,
|
||||
""ReleaseDate"": null,
|
||||
""ReleaseCountries"": null
|
||||
}
|
||||
}
|
||||
]", json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NestedValueObjects()
|
||||
{
|
||||
|
||||
@@ -143,7 +143,7 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
#else
|
||||
[JsonIgnore]
|
||||
#endif
|
||||
public string nonSerializedField;
|
||||
public string nonSerializedField;
|
||||
|
||||
public bool Equals(SerializableType other)
|
||||
{
|
||||
|
||||
@@ -48,6 +48,10 @@ namespace Newtonsoft.Json.Converters
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||
{
|
||||
Type t = value.GetType();
|
||||
IList<Type> genericArguments = t.GetGenericArguments();
|
||||
Type keyType = genericArguments[0];
|
||||
Type valueType = genericArguments[1];
|
||||
|
||||
PropertyInfo keyProperty = t.GetProperty(KeyName);
|
||||
PropertyInfo valueProperty = t.GetProperty(ValueName);
|
||||
|
||||
@@ -56,9 +60,9 @@ namespace Newtonsoft.Json.Converters
|
||||
writer.WriteStartObject();
|
||||
|
||||
writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyName) : KeyName);
|
||||
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value));
|
||||
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value), keyType);
|
||||
writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(ValueName) : ValueName);
|
||||
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value));
|
||||
serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value), valueType);
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
|
||||
|
||||
@@ -642,6 +642,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => SerializeObject(value))")]
|
||||
public static Task<string> SerializeObjectAsync(object value)
|
||||
{
|
||||
return SerializeObjectAsync(value, Formatting.None, null);
|
||||
@@ -656,6 +657,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => SerializeObject(value, formatting))")]
|
||||
public static Task<string> SerializeObjectAsync(object value, Formatting formatting)
|
||||
{
|
||||
return SerializeObjectAsync(value, formatting, null);
|
||||
@@ -672,6 +674,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("SerializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to serialize JSON asynchronously: Task.Factory.StartNew(() => SerializeObject(value, formatting, settings))")]
|
||||
public static Task<string> SerializeObjectAsync(object value, Formatting formatting, JsonSerializerSettings settings)
|
||||
{
|
||||
return Task.Factory.StartNew(() => SerializeObject(value, formatting, settings));
|
||||
@@ -841,6 +844,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => DeserializeObject<T>(value))")]
|
||||
public static Task<T> DeserializeObjectAsync<T>(string value)
|
||||
{
|
||||
return DeserializeObjectAsync<T>(value, null);
|
||||
@@ -859,6 +863,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => DeserializeObject<T>(value, settings))")]
|
||||
public static Task<T> DeserializeObjectAsync<T>(string value, JsonSerializerSettings settings)
|
||||
{
|
||||
return Task.Factory.StartNew(() => DeserializeObject<T>(value, settings));
|
||||
@@ -872,6 +877,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => DeserializeObject(value))")]
|
||||
public static Task<object> DeserializeObjectAsync(string value)
|
||||
{
|
||||
return DeserializeObjectAsync(value, null, null);
|
||||
@@ -890,6 +896,7 @@ namespace Newtonsoft.Json
|
||||
/// <returns>
|
||||
/// A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
|
||||
/// </returns>
|
||||
[ObsoleteAttribute("DeserializeObjectAsync is obsolete. Use the Task.Factory.StartNew method to deserialize JSON asynchronously: Task.Factory.StartNew(() => DeserializeObject(value, type, settings))")]
|
||||
public static Task<object> DeserializeObjectAsync(string value, Type type, JsonSerializerSettings settings)
|
||||
{
|
||||
return Task.Factory.StartNew(() => DeserializeObject(value, type, settings));
|
||||
|
||||
@@ -90,6 +90,6 @@ using System.Security;
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly: AssemblyVersion("4.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("6.0.1.16919")]
|
||||
[assembly: AssemblyVersion("6.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("6.0.1.16929")]
|
||||
[assembly: CLSCompliant(true)]
|
||||
|
||||
@@ -143,7 +143,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
/// Gets or sets the default members search flags.
|
||||
/// </summary>
|
||||
/// <value>The default members search flags.</value>
|
||||
[ObsoleteAttribute("DefaultMembersSearchFlags is obsolete. Inherit from DefaultContractResolver and override the GetSerializableMembers method instead.")]
|
||||
[ObsoleteAttribute("DefaultMembersSearchFlags is obsolete. To modify the members serialized inherit from DefaultContractResolver and override the GetSerializableMembers method instead.")]
|
||||
public BindingFlags DefaultMembersSearchFlags { get; set; }
|
||||
#else
|
||||
private BindingFlags DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.Public;
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
internal class JsonSerializerInternalWriter : JsonSerializerInternalBase
|
||||
{
|
||||
private JsonContract _rootContract;
|
||||
private int _rootLevel;
|
||||
private readonly List<object> _serializeStack = new List<object>();
|
||||
private JsonSerializerProxy _internalSerializer;
|
||||
|
||||
@@ -62,14 +63,13 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (jsonWriter == null)
|
||||
throw new ArgumentNullException("jsonWriter");
|
||||
|
||||
if (objectType != null)
|
||||
_rootContract = Serializer._contractResolver.ResolveContract(objectType);
|
||||
_rootContract = (objectType != null) ? Serializer._contractResolver.ResolveContract(objectType) : null;
|
||||
_rootLevel = _serializeStack.Count + 1;
|
||||
|
||||
JsonContract contract = GetContractSafe(value);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
SerializeValue(jsonWriter, value, contract, null, null, null);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -87,6 +87,12 @@ namespace Newtonsoft.Json.Serialization
|
||||
throw;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
// clear root contract to ensure that if level was > 1 then it won't
|
||||
// accidently be used for non root values
|
||||
_rootContract = null;
|
||||
}
|
||||
}
|
||||
|
||||
private JsonSerializerProxy GetInternalSerializer()
|
||||
@@ -869,7 +875,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
if (containerContract.ItemContract == null || contract.UnderlyingType != containerContract.ItemContract.CreatedType)
|
||||
return true;
|
||||
}
|
||||
else if (_rootContract != null && _serializeStack.Count == 1)
|
||||
else if (_rootContract != null && _serializeStack.Count == _rootLevel)
|
||||
{
|
||||
if (contract.UnderlyingType != _rootContract.CreatedType)
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user