Skip to content

Commit 981438c

Browse files
committed
Added already deserialized bypass and tests
Added a bypass to return a string that as already been deserialized when it lands at StringConverter.ToType() Removed portion of string escape character processing in JsonConvert as it was implemented in StringConverter (unicode escaped character processing still remains in JsonConvert) Added Tests for multiple escaped characters in a string and in an object containing a string property. Added test case for string converter test for serializing and deserializing strings with multiple escaped characters
1 parent 96921cc commit 981438c

File tree

4 files changed

+72
-26
lines changed

4 files changed

+72
-26
lines changed

nanoFramework.Json.Test/Converters/StringConverterTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public void StringConverter_ToJson_Should_ReturnValidData(string value, string e
5151
[DataRow("['Text3', 1]", "['Text3', 1]")] // Array
5252
[DataRow("{\"Text1\" : \"/Text1/\"}", "{\"Text1\" : \"/Text1/\"}")] // Json
5353
[DataRow("ä", "ä")] // Unicode
54+
[DataRow("\"I:\\\\nano\\\\rpath\\\\to\"", "I:\\nano\\rpath\\to")]
5455
public void StringConverter_ToType_Should_HandleSpecialCharacters(string value, string expectedValue)
5556
{
5657
var converter = new Json.Converters.StringConverter();
@@ -68,6 +69,7 @@ public void StringConverter_ToType_Should_HandleSpecialCharacters(string value,
6869
[DataRow("Text\n1", "\"Text\\n1\"")] // Newline
6970
[DataRow("Text\t1", "\"Text\\t1\"")] // Tab
7071
[DataRow("ä", "\"ä\"")] // Unicode
72+
[DataRow("I:\\nano\\rpath\\to", "\"I:\\\\nano\\\\rpath\\\\to\"")]
7173
public void StringConverter_ToJson_Should_HandleSpecialCharacters(string value, string expectedValue)
7274
{
7375
var converter = new Json.Converters.StringConverter();

nanoFramework.Json.Test/JsonSerializerOptionsTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,34 @@ public void Can_serialize_and_deserialize_escaped_string()
387387
Assert.AreEqual(thing.Value, deserialized.Value);
388388
}
389389

390+
[TestMethod]
391+
public void Can_serialize_and_deserialize_object_containing_string_with_multiple_escaped_characters()
392+
{
393+
var thing = new ThingWithString
394+
{
395+
Value = "I:\\Nano\\rApp\\app.pe"
396+
};
397+
398+
var serialized = JsonConvert.SerializeObject(thing);
399+
var deserialized = (ThingWithString)JsonConvert.DeserializeObject(serialized, typeof(ThingWithString));
400+
Assert.AreEqual(thing.Value, deserialized.Value);
401+
}
402+
403+
[TestMethod]
404+
public void Can_serialize_and_deserialize_string_with_multiple_escaped_characters()
405+
{
406+
var testValue = "I:\\Nano\\rApp\\app.pe";
407+
Console.WriteLine("Original: " + testValue);
408+
409+
var serialized = JsonConvert.SerializeObject(testValue);
410+
Console.WriteLine("Serialized: " + serialized);
411+
412+
var deserialized = (string)JsonConvert.DeserializeObject(serialized, typeof(string));
413+
Console.WriteLine("Deserialized: " + deserialized);
414+
415+
Assert.AreEqual(testValue, deserialized);
416+
}
417+
390418
[TestMethod]
391419
public void Can_serialize_and_deserialize_complex_object()
392420
{

nanoFramework.Json/Converters/StringConverter.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,18 @@ public object ToType(object value)
101101
return value;
102102
}
103103

104-
//String by default has escaped \" at beggining and end, just remove them
105-
var resultString = sourceString.Substring(1, sourceString.Length - 2);
104+
string resultString;
105+
106+
// String by default has escaped \" at beggining and end, just remove them
107+
// if they have already been removed, string has likely already been deserialized,
108+
// and if so, then we just return it.
109+
if (!sourceString.StartsWith("\"") && !sourceString.EndsWith("\""))
110+
{
111+
return sourceString;
112+
}
113+
114+
resultString = sourceString.Substring(1, sourceString.Length - 2);
115+
106116
var newString = new StringBuilder();
107117
//Last character can not be escaped, because it's last one
108118
for (int i = 0; i < resultString.Length - 1; i++)

nanoFramework.Json/JsonConvert.cs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,32 +1088,38 @@ private static LexToken GetNextTokenInternal(ref int jsonPos, ref byte[] jsonByt
10881088
return EndToken(sb);
10891089
}
10901090

1091-
//TODO: replace with a mapping array? This switch is really incomplete.
1092-
switch (ch)
1091+
if(ch == 'u')
10931092
{
1094-
case 't':
1095-
ch = '\t';
1096-
break;
1097-
1098-
case 'r':
1099-
ch = '\r';
1100-
break;
1101-
1102-
case 'n':
1103-
ch = '\n';
1104-
break;
1105-
1106-
case 'u':
1107-
unicodeEncoded = true;
1108-
break;
1109-
1110-
case '"':
1111-
ch = '"';
1112-
break;
1113-
1114-
default:
1115-
throw new DeserializationException();
1093+
unicodeEncoded = true;
11161094
}
1095+
1096+
//TODO: replace with a mapping array? This switch is really incomplete.
1097+
// Has been moved to StringConverter but unicode part still remains here
1098+
//switch (ch)
1099+
//{
1100+
// case 't':
1101+
// ch = '\t';
1102+
// break;
1103+
1104+
// case 'r':
1105+
// ch = '\r';
1106+
// break;
1107+
1108+
// case 'n':
1109+
// ch = '\n';
1110+
// break;
1111+
1112+
// case 'u':
1113+
// unicodeEncoded = true;
1114+
// break;
1115+
1116+
// case '"':
1117+
// ch = '"';
1118+
// break;
1119+
1120+
// default:
1121+
// throw new DeserializationException();
1122+
//}
11171123
}
11181124

11191125
if ((sb != null) && ((ch != openQuote) || (escaped)))

0 commit comments

Comments
 (0)