diff --git a/MinecraftClient/Json.cs b/MinecraftClient/Json.cs
index 6e98a4b4..bf752da2 100644
--- a/MinecraftClient/Json.cs
+++ b/MinecraftClient/Json.cs
@@ -7,7 +7,7 @@ namespace MinecraftClient
{
///
/// This class parses JSON data and returns an object describing that data.
- /// Really lightweight JSON handling by ORelio - (c) 2013 - 2014
+ /// Really lightweight JSON handling by ORelio - (c) 2013 - 2020
///
public static class Json
{
@@ -51,12 +51,14 @@ namespace MinecraftClient
try
{
JSONData data;
+ SkipSpaces(toparse, ref cursorpos);
switch (toparse[cursorpos])
{
//Object
case '{':
data = new JSONData(JSONData.DataType.Object);
cursorpos++;
+ SkipSpaces(toparse, ref cursorpos);
while (toparse[cursorpos] != '}')
{
if (toparse[cursorpos] == '"')
@@ -75,6 +77,7 @@ namespace MinecraftClient
case '[':
data = new JSONData(JSONData.DataType.Array);
cursorpos++;
+ SkipSpaces(toparse, ref cursorpos);
while (toparse[cursorpos] != ']')
{
if (toparse[cursorpos] == ',') { cursorpos++; }
@@ -95,10 +98,10 @@ namespace MinecraftClient
try //Unicode character \u0123
{
if (toparse[cursorpos + 1] == 'u'
- && isHex(toparse[cursorpos + 2])
- && isHex(toparse[cursorpos + 3])
- && isHex(toparse[cursorpos + 4])
- && isHex(toparse[cursorpos + 5]))
+ && IsHex(toparse[cursorpos + 2])
+ && IsHex(toparse[cursorpos + 3])
+ && IsHex(toparse[cursorpos + 4])
+ && IsHex(toparse[cursorpos + 5]))
{
//"abc\u0123abc" => "0123" => 0123 => Unicode char n°0123 => Add char to string
data.StringValue += char.ConvertFromUtf32(int.Parse(toparse.Substring(cursorpos + 2, 4), System.Globalization.NumberStyles.HexNumber));
@@ -164,16 +167,21 @@ namespace MinecraftClient
if (toparse[cursorpos] == 'e') { cursorpos++; data.StringValue = "false"; }
break;
+ //Null field
+ case 'n':
+ data = new JSONData(JSONData.DataType.String);
+ cursorpos++;
+ if (toparse[cursorpos] == 'u') { cursorpos++; }
+ if (toparse[cursorpos] == 'l') { cursorpos++; }
+ if (toparse[cursorpos] == 'l') { cursorpos++; data.StringValue = "null"; }
+ break;
+
//Unknown data
default:
cursorpos++;
return String2Data(toparse, ref cursorpos);
}
- while (cursorpos < toparse.Length
- && (char.IsWhiteSpace(toparse[cursorpos])
- || toparse[cursorpos] == '\r'
- || toparse[cursorpos] == '\n'))
- cursorpos++;
+ SkipSpaces(toparse, ref cursorpos);
return data;
}
catch (IndexOutOfRangeException)
@@ -183,10 +191,24 @@ namespace MinecraftClient
}
///
- /// Small function for checking if a char is an hexadecimal char (0-9 A-F a-f)
+ /// Check if a char is an hexadecimal char (0-9 A-F a-f)
///
/// Char to test
/// True if hexadecimal
- private static bool isHex(char c) { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); }
+ private static bool IsHex(char c) { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')); }
+
+ ///
+ /// Advance the cursor to skip white spaces and line breaks
+ ///
+ /// String to parse
+ /// Cursor position to update
+ private static void SkipSpaces(string toparse, ref int cursorpos)
+ {
+ while (cursorpos < toparse.Length
+ && (char.IsWhiteSpace(toparse[cursorpos])
+ || toparse[cursorpos] == '\r'
+ || toparse[cursorpos] == '\n'))
+ cursorpos++;
+ }
}
}