diff --git a/Build/build.ps1 b/Build/build.ps1 index cdc7dc35..ca539e97 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -123,6 +123,8 @@ function MergeAssembly($dllPrimaryAssembly, $signKey, [string[]]$mergedAssemlies $temporaryDir = $primary.DirectoryName + "\" + [Guid]::NewGuid().ToString() New-Item $temporaryDir -ItemType Directory + $ilMergeKeyFile = switch($signAssemblies) { $true { "/keyfile:$signKeyPath" } default { "" } } + try { exec { .\Tools\ILMerge\ilmerge.exe "/internalize" "/closed" "/log:$workingDir\$mergedAssemblyName.MergeLog.txt" $ilMergeKeyFile "/out:$temporaryDir\$mergedAssemblyName" $dllPrimaryAssembly $mergeAssemblyPaths } "Error executing ILMerge" diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs index 2a8a8e60..f3e4a3a7 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs @@ -261,8 +261,6 @@ namespace Newtonsoft.Json.Tests.Linq 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); @@ -273,5 +271,24 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, result2.Bytes); } + + [Test] + public void ReadBytesFromEmptyString() + { + var bytes = new HasBytes { Bytes = new byte[0] }; + var json = JsonConvert.SerializeObject(bytes); + + TextReader textReader = new StringReader(json); + JsonReader jsonReader = new JsonTextReader(textReader); + + var jToken = JToken.ReadFrom(jsonReader); + + jsonReader = new JTokenReader(jToken); + + var result2 = (HasBytes)JsonSerializer.Create(null) + .Deserialize(jsonReader, typeof(HasBytes)); + + Assert.AreEqual(new byte[0], result2.Bytes); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 95774c26..3ffe737d 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -3436,5 +3436,32 @@ keyword such as type of business."" Assert.IsTrue(d.Contains("III")); } #endif + + private class MyClass + { + public byte[] Prop1 { get; set; } + + public MyClass() + { + Prop1 = new byte[0]; + } + } + + [Test] + public void DeserializeByteArray() + { + JsonSerializer serializer1 = new JsonSerializer(); + serializer1.Converters.Add(new IsoDateTimeConverter()); + serializer1.NullValueHandling = NullValueHandling.Ignore; + + string json = @"[{""Prop1"":""""},{""Prop1"":""""}]"; + + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + + MyClass[] z = (MyClass[])serializer1.Deserialize(reader, typeof(MyClass[])); + Assert.AreEqual(2, z.Length); + Assert.AreEqual(0, z[0].Prop1.Length); + Assert.AreEqual(0, z[1].Prop1.Length); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index a9e36b5d..446542c1 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -337,8 +337,16 @@ namespace Newtonsoft.Json case '\'': ReadStringIntoBuffer(currentChar); - byte[] data = Convert.FromBase64CharArray(_buffer.GetInternalBuffer(), 0, _buffer.Position); - _buffer.Position = 0; + byte[] data; + if (_buffer.Position == 0) + { + data = new byte[0]; + } + else + { + data = Convert.FromBase64CharArray(_buffer.GetInternalBuffer(), 0, _buffer.Position); + _buffer.Position = 0; + } SetToken(JsonToken.Bytes, data); diff --git a/Src/Newtonsoft.Json/Linq/JTokenReader.cs b/Src/Newtonsoft.Json/Linq/JTokenReader.cs index 74ee21ea..37234192 100644 --- a/Src/Newtonsoft.Json/Linq/JTokenReader.cs +++ b/Src/Newtonsoft.Json/Linq/JTokenReader.cs @@ -41,7 +41,8 @@ namespace Newtonsoft.Json.Linq // attempt to convert possible base 64 string to bytes if (TokenType == JsonToken.String) { - byte[] data = Convert.FromBase64String((string)Value); + string s = (string) Value; + byte[] data = (s.Length == 0) ? new byte[0] : Convert.FromBase64String(s); SetToken(JsonToken.Bytes, data); }