-Fix issue when deserializing string to byte data

-Fix converting a JValue to a compatible type
-Allow JsonConverterAttribute to be added to interfaces/structs/enums
This commit is contained in:
JamesNK
2010-06-11 13:11:44 +00:00
parent f5ed7be283
commit 4a1c8d3a80
5 changed files with 50 additions and 3 deletions
@@ -190,5 +190,12 @@ namespace Newtonsoft.Json.Tests.Linq
JValue v = new JValue((object)null);
int i = (int) v;
}
[Test]
public void ConvertValueToCompatibleType()
{
IComparable c = (new JValue(1).Value<IComparable>());
Assert.AreEqual(1, c);
}
}
}
@@ -33,6 +33,7 @@ using Newtonsoft.Json.Tests.TestObjects;
using NUnit.Framework;
using Newtonsoft.Json.Utilities;
using System.Net;
using System.Runtime.Serialization;
namespace Newtonsoft.Json.Tests.Serialization
{
@@ -426,5 +427,37 @@ namespace Newtonsoft.Json.Tests.Serialization
Assert.AreEqual(4, nested[3]);
Assert.AreEqual(5, nested[4]);
}
#if !SILVERLIGHT && !PocketPC
[Test]
public void DeserializeUsingCustomBinder()
{
string json = @"{
""$id"": ""1"",
""$type"": ""Newtonsoft.Json.Tests.TestObjects.Employee"",
""Name"": ""Name!""
}";
object p = JsonConvert.DeserializeObject(json, null, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
Binder = new CustomSerializationBinder()
});
Assert.IsInstanceOfType(typeof(Person), p);
Person person = (Person)p;
Assert.AreEqual("Name!", person.Name);
}
public class CustomSerializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return typeof (Person);
}
}
#endif
}
}
@@ -10,7 +10,7 @@ namespace Newtonsoft.Json
/// <summary>
/// Instructs the <see cref="JsonSerializer"/> to use the specified <see cref="JsonConverter"/> when serializing the member or class.
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false)]
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Enum, AllowMultiple = false)]
public sealed class JsonConverterAttribute : Attribute
{
private readonly Type _converterType;
+3
View File
@@ -267,6 +267,9 @@ namespace Newtonsoft.Json.Linq
if (value == null)
throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(T)));
if (value.Value is U)
return (U)value.Value;
Type targetType = typeof(U);
if (ReflectionUtils.IsNullableType(targetType))
@@ -214,8 +214,8 @@ namespace Newtonsoft.Json.Serialization
{
switch (reader.TokenType)
{
// populate a typed object or generic dictionary/array
// depending upon whether an objectType was supplied
// populate a typed object or generic dictionary/array
// depending upon whether an objectType was supplied
case JsonToken.StartObject:
return CreateObject(reader, objectType, contract, member, existingValue);
case JsonToken.StartArray:
@@ -233,6 +233,10 @@ namespace Newtonsoft.Json.Serialization
ReflectionUtils.IsNullableType(objectType))
return null;
// string that needs to be returned as a byte array should be base 64 decoded
if (objectType == typeof(byte[]))
return Convert.FromBase64String((string)reader.Value);
return EnsureType(reader.Value, objectType);
case JsonToken.StartConstructor:
case JsonToken.EndConstructor: