private static DynValue ParseJsonValue(Lexer L, Script script) { if (L.Current.Type == TokenType.Brk_Open_Curly) { Table t = ParseJsonObject(L, script); return DynValue.NewTable(t); } else if (L.Current.Type == TokenType.Brk_Open_Square) { Table t = ParseJsonArray(L, script); return DynValue.NewTable(t); } else if (L.Current.Type == TokenType.String) { return DynValue.NewString(L.Current.Text); } else if (L.Current.Type == TokenType.Number) { return DynValue.NewNumber(L.Current.GetNumberValue()).AsReadOnly(); } else if (L.Current.Type == TokenType.True) { return DynValue.True; } else if (L.Current.Type == TokenType.False) { return DynValue.False; } else if (L.Current.Type == TokenType.Name && L.Current.Text == "null") { return JsonNull.Create(); } else { throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text); } }
private static Table ParseJsonObject(Lexer L, Script script) { Table t = new Table(script); L.Next(); while (L.Current.Type != TokenType.Brk_Close_Curly) { AssertToken(L, TokenType.String); string key = L.Current.Text; L.Next(); AssertToken(L, TokenType.Colon); L.Next(); DynValue v = ParseJsonValue(L, script); t.Set(key, v); L.Next(); if (L.Current.Type == TokenType.Comma) L.Next(); } return t; }
private static void AssertToken(Lexer L, TokenType type) { if (L.Current.Type != type) throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text); }
private static Table ParseJsonArray(Lexer L, Script script) { Table t = new Table(script); L.Next(); while (L.Current.Type != TokenType.Brk_Close_Square) { DynValue v = ParseJsonValue(L, script); t.Append(v); L.Next(); if (L.Current.Type == TokenType.Comma) L.Next(); } return t; }
/// <summary> /// Converts a json string to a table /// </summary> /// <param name="json">The json.</param> /// <param name="script">The script to which the table is assigned (null for prime tables).</param> /// <returns>A table containing the representation of the given json.</returns> public static Table JsonToTable(string json, Script script = null) { Lexer L = new Lexer(0, json, false); if (L.Current.Type == TokenType.Brk_Open_Curly) return ParseJsonObject(L, script); else if (L.Current.Type == TokenType.Brk_Open_Square) return ParseJsonArray(L, script); else throw new SyntaxErrorException(L.Current, "Unexpected token : '{0}'", L.Current.Text); }