@@ -378,7 +378,7 @@ json_skip_white(js_read_T *reader)
378378}
379379
380380 static int
381- json_decode_string (js_read_T * reader , typval_T * res )
381+ json_decode_string (js_read_T * reader , typval_T * res , int quote )
382382{
383383 garray_T ga ;
384384 int len ;
@@ -389,8 +389,8 @@ json_decode_string(js_read_T *reader, typval_T *res)
389389 if (res != NULL )
390390 ga_init2 (& ga , 1 , 200 );
391391
392- p = reader -> js_buf + reader -> js_used + 1 ; /* skip over " */
393- while (* p != '"' )
392+ p = reader -> js_buf + reader -> js_used + 1 ; /* skip over " or ' */
393+ while (* p != quote )
394394 {
395395 /* The JSON is always expected to be utf-8, thus use utf functions
396396 * here. The string is converted below if needed. */
@@ -504,7 +504,7 @@ json_decode_string(js_read_T *reader, typval_T *res)
504504 }
505505
506506 reader -> js_used = (int )(p - reader -> js_buf );
507- if (* p == '"' )
507+ if (* p == quote )
508508 {
509509 ++ reader -> js_used ;
510510 if (res != NULL )
@@ -620,7 +620,8 @@ json_decode_item(js_read_T *reader, typval_T *res, int options)
620620
621621 if (top_item != NULL && top_item -> jd_type == JSON_OBJECT_KEY
622622 && (options & JSON_JS )
623- && reader -> js_buf [reader -> js_used ] != '"' )
623+ && reader -> js_buf [reader -> js_used ] != '"'
624+ && reader -> js_buf [reader -> js_used ] != '\'' )
624625 {
625626 char_u * key ;
626627
@@ -690,7 +691,17 @@ json_decode_item(js_read_T *reader, typval_T *res, int options)
690691 continue ;
691692
692693 case '"' : /* string */
693- retval = json_decode_string (reader , cur_item );
694+ retval = json_decode_string (reader , cur_item , * p );
695+ break ;
696+
697+ case '\'' :
698+ if (options & JSON_JS )
699+ retval = json_decode_string (reader , cur_item , * p );
700+ else
701+ {
702+ EMSG (_ (e_invarg ));
703+ retval = FAIL ;
704+ }
694705 break ;
695706
696707 case ',' : /* comma: empty item */
0 commit comments