From 2f11d3f9706550d60417ece83a061e45c24d8fd6 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Sat, 17 Apr 2010 07:54:07 +0000 Subject: [PATCH] -Fix JTokenReader.ReadAsBytes to read strings as base64 data --- .../Linq/JTokenReaderTest.cs | 26 +++++++++++++++++++ .../Converters/KeyValuePairConverter.cs | 24 +++++++++++++++++ Src/Newtonsoft.Json/Linq/JTokenReader.cs | 8 ++++++ 3 files changed, 58 insertions(+) diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs index 51e44595..2a8a8e60 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs @@ -247,5 +247,31 @@ namespace Newtonsoft.Json.Tests.Linq jsonReader.ReadAsBytes(); } } + + public class HasBytes + { + public byte[] Bytes { get; set; } + } + + [Test] + public void ReadBytesFromString() + { + var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } }; + var json = JsonConvert.SerializeObject(bytes); + + TextReader textReader = new StringReader(json); + JsonReader jsonReader = new JsonTextReader(textReader); + //var result = (HasBytes)JsonSerializer.Create(null) + // .Deserialize(jsonReader, typeof(HasBytes)); + + var jToken = JToken.ReadFrom(jsonReader); + + jsonReader = new JTokenReader(jToken); + + var result2 = (HasBytes)JsonSerializer.Create(null) + .Deserialize(jsonReader, typeof(HasBytes)); + + Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, result2.Bytes); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs b/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs index 58e22db1..e546bdbc 100644 --- a/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs +++ b/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs @@ -7,8 +7,17 @@ using System.Reflection; namespace Newtonsoft.Json.Converters { + /// + /// Converts a to and from JSON. + /// public class KeyValuePairConverter : JsonConverter { + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Type t = value.GetType(); @@ -23,6 +32,14 @@ namespace Newtonsoft.Json.Converters writer.WriteEndObject(); } + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing value of object being read. + /// The calling serializer. + /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { IList genericArguments = objectType.GetGenericArguments(); @@ -40,6 +57,13 @@ namespace Newtonsoft.Json.Converters return ReflectionUtils.CreateInstance(objectType, key, value); } + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// public override bool CanConvert(Type objectType) { if (objectType.IsValueType && objectType.IsGenericType) diff --git a/Src/Newtonsoft.Json/Linq/JTokenReader.cs b/Src/Newtonsoft.Json/Linq/JTokenReader.cs index 011ec158..74ee21ea 100644 --- a/Src/Newtonsoft.Json/Linq/JTokenReader.cs +++ b/Src/Newtonsoft.Json/Linq/JTokenReader.cs @@ -37,6 +37,14 @@ namespace Newtonsoft.Json.Linq public override byte[] ReadAsBytes() { Read(); + + // attempt to convert possible base 64 string to bytes + if (TokenType == JsonToken.String) + { + byte[] data = Convert.FromBase64String((string)Value); + SetToken(JsonToken.Bytes, data); + } + if (TokenType != JsonToken.Bytes) throw new JsonReaderException("Error reading bytes. Expected bytes but got {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));