Browse Source

Allow tabs in property names when parsing JSON (#898)

Marko Lahma 4 years ago
parent
commit
ab88152cee
2 changed files with 22 additions and 8 deletions
  1. 16 0
      Jint.Tests/Runtime/JsonTests.cs
  2. 6 8
      Jint/Native/Json/JsonParser.cs

+ 16 - 0
Jint.Tests/Runtime/JsonTests.cs

@@ -0,0 +1,16 @@
+using Xunit;
+
+namespace Jint.Tests.Runtime
+{
+    public class JsonTests
+    {
+        [Fact]
+        public void CanParseTabsInProperties()
+        {
+             var engine = new Engine();
+             const string script = @"JSON.parse(""{\""abc\\tdef\"": \""42\""}"");";
+             var obj = engine.Execute(script).GetCompletionValue().AsObject();
+             Assert.True(obj.HasOwnProperty("abc\tdef"));
+        }
+    }
+}

+ 6 - 8
Jint/Native/Json/JsonParser.cs

@@ -621,7 +621,7 @@ namespace Jint.Native.Json
                     index: token.Range[0],
                     position: new Position(token.LineNumber ?? _lineNumber, token.Range[0] - _lineStart + 1));
             var exception = new ParserException("Line " + lineNumber  + ": " + msg, error);
-            
+
             throw exception;
         }
 
@@ -711,7 +711,7 @@ namespace Jint.Native.Json
                 }
 
                 var name = Lex().Value.ToString();
-                if (PropertyNameContainsInvalidChar0To31(name))
+                if (PropertyNameContainsInvalidCharacters(name))
                 {
                     ExceptionHelper.ThrowSyntaxError(_engine, $"Invalid character in property name '{name}'");
                 }
@@ -732,14 +732,12 @@ namespace Jint.Native.Json
             return obj;
         }
 
-        private static bool PropertyNameContainsInvalidChar0To31(string s)
+        private static bool PropertyNameContainsInvalidCharacters(string propertyName)
         {
-            const int max = 31;
-
-            for (var i = 0; i < s.Length; i++)
+            const char max = (char) 31;
+            foreach (var c in propertyName)
             {
-                var val = (int)s[i];
-                if (val <= max)
+                if (c != '\t' && c <= max)
                     return true;
             }
             return false;