Skip to content

Commit 14a108f

Browse files
committed
fix escaping of special characters (issue zaach#22)
1 parent c07fb3d commit 14a108f

File tree

5 files changed

+36
-9
lines changed

5 files changed

+36
-9
lines changed

lib/jsonlint.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
99

1010
var $0 = $$.length - 1;
1111
switch (yystate) {
12-
case 1:this.$ = yytext.replace(/\\\\/g, "\\");
12+
case 1: // replace escaped characters with actual character
13+
this.$ = yytext.replace(/\\(\\|")/g, "$"+"1")
14+
.replace(/\\n/g,'\n')
15+
.replace(/\\r/g,'\r')
16+
.replace(/\\t/g,'\t')
17+
.replace(/\\v/g,'\v')
18+
.replace(/\\f/g,'\f')
19+
.replace(/\\b/g,'\b');
20+
1321
break;
1422
case 2:this.$ = Number(yytext);
1523
break;
@@ -367,13 +375,13 @@ var YYSTATE=YY_START
367375
switch($avoiding_name_collisions) {
368376
case 0:/* skip whitespace */
369377
break;
370-
case 1:return 6;
378+
case 1:return 6
371379
break;
372-
case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4;
380+
case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4
373381
break;
374-
case 3: return 17
382+
case 3:return 17
375383
break;
376-
case 4: return 18
384+
case 4:return 18
377385
break;
378386
case 5:return 23
379387
break;

src/jsonlint.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ frac "."[0-9]+
99
\"(?:'\\'[\\"bfnrt/]|'\\u'[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*\" yytext = yytext.substr(1,yyleng-2); return 'STRING'
1010

1111
"{" return '{'
12-
"}" return ''
12+
"}" return '}'
1313
"[" return '['
1414
"]" return ']'
1515
"," return ','

src/jsonlint.y

+9-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@
99

1010
JSONString
1111
: STRING
12-
{$$ = yytext.replace(/\\\\/g, "\\");}
12+
{ // replace escaped characters with actual character
13+
$$ = yytext.replace(/\\(\\|")/g, "$"+"1")
14+
.replace(/\\n/g,'\n')
15+
.replace(/\\r/g,'\r')
16+
.replace(/\\t/g,'\t')
17+
.replace(/\\v/g,'\v')
18+
.replace(/\\f/g,'\f')
19+
.replace(/\\b/g,'\b');
20+
}
1321
;
1422

1523
JSONNumber

test/all-tests.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,20 @@ exports["test escaped backslash"] = function () {
1212
assert.deepEqual(parser.parse(json), {"foo": "\\"});
1313
};
1414

15+
exports["test escaped chars"] = function () {
16+
var json = '{"foo": "\\\\\\\""}';
17+
assert.deepEqual(parser.parse(json), {"foo": '\\\"'});
18+
};
19+
20+
exports["test escaped \\n"] = function () {
21+
var json = '{"foo": "\\\\\\n"}';
22+
assert.deepEqual(parser.parse(json), {"foo": '\\\n'});
23+
};
24+
1525
exports["test string with escaped line break"] = function () {
1626
var json = '{"foo": "bar\\nbar"}';
17-
assert.deepEqual(parser.parse(json), {"foo": "bar\\nbar"});
27+
assert.deepEqual(parser.parse(json), {"foo": "bar\nbar"});
28+
assert.equal(JSON.stringify(parser.parse(json)).length, 18);
1829
};
1930

2031
exports["test string with line break"] = function () {

web/jsonlint.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)