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

Fully unescape string before decoding base64 to byte[] #409

Merged
merged 2 commits into from Apr 24, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ServiceStack.Text/Common/DeserializeArray.cs
Expand Up @@ -181,7 +181,7 @@ public static string[] ParseStringArray(string value)
public static byte[] ParseByteArray(string value)
{
if ((value = DeserializeListWithElements<TSerializer>.StripList(value)) == null) return null;
if ((value = Serializer.UnescapeSafeString(value)) == null) return null;
if ((value = Serializer.UnescapeString(value)) == null) return null;
return value == string.Empty
? new byte[0]
: Convert.FromBase64String(value);
Expand Down
14 changes: 14 additions & 0 deletions tests/ServiceStack.Text.Tests/DataContractTests.cs
Expand Up @@ -195,6 +195,13 @@ public class ClassFour
public string Title;
}

[DataContract]
public class ClassFive
{
[DataMember(Name = "some-bytes")]
public byte[] Bytes;
}

[Test]
public void Csv_Serialize_Should_Respects_DataContract_Name()
{
Expand Down Expand Up @@ -244,6 +251,13 @@ public void Json_Serialize_Should_Respects_DataContract_Name()
Is.EqualTo("{\"Id\":1,\"listClassTwo\":[{\"NewName\":\"Name One\"},{\"NewName\":\"Name Two\"}]}"));
}

[Test]
public void Json_Serialize_Should_Respects_DataContract_Field_Name_With_Bytes_Deserialize()
{
var t = JsonSerializer.DeserializeFromString<ClassFive>("{\"some-bytes\": \"YWI=\"}");
Assert.IsTrue (t.Bytes.AreEqual (new byte[] { 0x61, 0x62 }));
}

[Test]
public void Can_get_weak_DataMember()
{
Expand Down
19 changes: 16 additions & 3 deletions tests/ServiceStack.Text.Tests/JsonObjectTests.cs
Expand Up @@ -5,16 +5,29 @@ namespace ServiceStack.Text.Tests
[TestFixture]
public class JsonObjectTests : TestBase
{
private const string JsonCentroid = @"{""place"":{ ""woeid"":12345, ""placeTypeName"":""St\\ate"" } }";
private const string JsonCentroid = @"{""place"":{ ""woeid"":12345, ""placeTypeName"":""St\\a\/te"" } }";

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

placeTypeName = JsonObject.Parse(JsonCentroid).Object("place").Get<string>("placeTypeName");
Assert.That(placeTypeName, Is.EqualTo("St\\ate"));
Assert.That(placeTypeName, Is.EqualTo("St\\a/te"));
}

private const string JsonEscapedByteArray = @"{""universalId"":""09o4bFTeBq3hTKhoJVCkzSLRG\/o1SktTPqxgZ3L3Xss=""}";

[Test]
public void Can_dynamically_parse_JSON_with_escape_byte_array()
{
var parsed = JsonObject.Parse(JsonEscapedByteArray).Get<byte[]>("universalId");
Assert.That(parsed, Is.EqualTo(new byte[] {
0xd3, 0xda, 0x38, 0x6c, 0x54, 0xde, 0x06, 0xad,
0xe1, 0x4c, 0xa8, 0x68, 0x25, 0x50, 0xa4, 0xcd,
0x22, 0xd1, 0x1b, 0xfa, 0x35, 0x4a, 0x4b, 0x53,
0x3e, 0xac, 0x60, 0x67, 0x72, 0xf7, 0x5e, 0xcb}));
}

[Test]
Expand Down