Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 55891a2

Browse files
committed
Merge pull request #409 from bjdodson/master
Fully unescape string before decoding base64 to byte[]
2 parents a9885ea + 1512b92 commit 55891a2

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/ServiceStack.Text/Common/DeserializeArray.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public static string[] ParseStringArray(string value)
181181
public static byte[] ParseByteArray(string value)
182182
{
183183
if ((value = DeserializeListWithElements<TSerializer>.StripList(value)) == null) return null;
184-
if ((value = Serializer.UnescapeSafeString(value)) == null) return null;
184+
if ((value = Serializer.UnescapeString(value)) == null) return null;
185185
return value == string.Empty
186186
? new byte[0]
187187
: Convert.FromBase64String(value);

tests/ServiceStack.Text.Tests/DataContractTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@ public class ClassFour
195195
public string Title;
196196
}
197197

198+
[DataContract]
199+
public class ClassFive
200+
{
201+
[DataMember(Name = "some-bytes")]
202+
public byte[] Bytes;
203+
}
204+
198205
[Test]
199206
public void Csv_Serialize_Should_Respects_DataContract_Name()
200207
{
@@ -244,6 +251,13 @@ public void Json_Serialize_Should_Respects_DataContract_Name()
244251
Is.EqualTo("{\"Id\":1,\"listClassTwo\":[{\"NewName\":\"Name One\"},{\"NewName\":\"Name Two\"}]}"));
245252
}
246253

254+
[Test]
255+
public void Json_Serialize_Should_Respects_DataContract_Field_Name_With_Bytes_Deserialize()
256+
{
257+
var t = JsonSerializer.DeserializeFromString<ClassFive>("{\"some-bytes\": \"YWI=\"}");
258+
Assert.IsTrue (t.Bytes.AreEqual (new byte[] { 0x61, 0x62 }));
259+
}
260+
247261
[Test]
248262
public void Can_get_weak_DataMember()
249263
{

tests/ServiceStack.Text.Tests/JsonObjectTests.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,29 @@ namespace ServiceStack.Text.Tests
55
[TestFixture]
66
public class JsonObjectTests : TestBase
77
{
8-
private const string JsonCentroid = @"{""place"":{ ""woeid"":12345, ""placeTypeName"":""St\\ate"" } }";
8+
private const string JsonCentroid = @"{""place"":{ ""woeid"":12345, ""placeTypeName"":""St\\a\/te"" } }";
99

1010
[Test]
1111
public void Can_dynamically_parse_JSON_with_escape_chars()
1212
{
1313
var placeTypeName = JsonObject.Parse(JsonCentroid).Object("place").Get("placeTypeName");
14-
Assert.That(placeTypeName, Is.EqualTo("St\\ate"));
14+
Assert.That(placeTypeName, Is.EqualTo("St\\a/te"));
1515

1616
placeTypeName = JsonObject.Parse(JsonCentroid).Object("place").Get<string>("placeTypeName");
17-
Assert.That(placeTypeName, Is.EqualTo("St\\ate"));
17+
Assert.That(placeTypeName, Is.EqualTo("St\\a/te"));
18+
}
19+
20+
private const string JsonEscapedByteArray = @"{""universalId"":""09o4bFTeBq3hTKhoJVCkzSLRG\/o1SktTPqxgZ3L3Xss=""}";
21+
22+
[Test]
23+
public void Can_dynamically_parse_JSON_with_escape_byte_array()
24+
{
25+
var parsed = JsonObject.Parse(JsonEscapedByteArray).Get<byte[]>("universalId");
26+
Assert.That(parsed, Is.EqualTo(new byte[] {
27+
0xd3, 0xda, 0x38, 0x6c, 0x54, 0xde, 0x06, 0xad,
28+
0xe1, 0x4c, 0xa8, 0x68, 0x25, 0x50, 0xa4, 0xcd,
29+
0x22, 0xd1, 0x1b, 0xfa, 0x35, 0x4a, 0x4b, 0x53,
30+
0x3e, 0xac, 0x60, 0x67, 0x72, 0xf7, 0x5e, 0xcb}));
1831
}
1932

2033
[Test]

0 commit comments

Comments
 (0)