Error JSON::_parse_value(Variant &value,Token& token,const CharType *p_str,int &index, int p_len,int &line,String &r_err_str) { if (token.type==TK_CURLY_BRACKET_OPEN) { Dictionary d; Error err = _parse_object(d,p_str,index,p_len,line,r_err_str); if (err) return err; value=d; return OK; } else if (token.type==TK_BRACKET_OPEN) { Array a; Error err = _parse_array(a,p_str,index,p_len,line,r_err_str); if (err) return err; value=a; return OK; } else if (token.type==TK_IDENTIFIER) { String id = token.value; if (id=="true") value=true; else if (id=="false") value=false; else if (id=="null") value=Variant(); else { r_err_str="Expected 'true','false' or 'null', got '"+id+"'."; return ERR_PARSE_ERROR; } return OK; } else if (token.type==TK_NUMBER) { value=token.value; return OK; } else if (token.type==TK_STRING) { value=token.value; return OK; } else { r_err_str="Expected value, got "+String(tk_name[token.type])+"."; return ERR_PARSE_ERROR; } return ERR_PARSE_ERROR; }
static GstAmfNode * _parse_value (AmfParser * parser) { GstAmfNode *node = NULL; GstAmfType type; type = _parse_u8 (parser); node = gst_amf_node_new (type); GST_DEBUG ("parsing type %d", type); switch (type) { case GST_AMF_TYPE_NUMBER: gst_amf_node_set_number (node, _parse_number (parser)); break; case GST_AMF_TYPE_BOOLEAN: gst_amf_node_set_boolean (node, _parse_u8 (parser)); break; case GST_AMF_TYPE_STRING: gst_amf_node_set_string_take (node, _parse_utf8_string (parser)); break; case GST_AMF_TYPE_OBJECT: _parse_object (parser, node); break; case GST_AMF_TYPE_MOVIECLIP: GST_ERROR ("unimplemented AMF type: movie clip"); break; case GST_AMF_TYPE_NULL: break; case GST_AMF_TYPE_ECMA_ARRAY: _parse_ecma_array (parser, node); break; case GST_AMF_TYPE_OBJECT_END: break; default: GST_ERROR ("unimplemented AMF type %d", type); break; } return node; }
Error JSON::parse(const String& p_json,Dictionary& r_ret,String &r_err_str,int &r_err_line) { const CharType *str = p_json.ptr(); int idx = 0; int len = p_json.length(); Token token; int line=0; String aux_key; Error err = _get_token(str,idx,len,token,line,r_err_str); if (err) return err; if (token.type!=TK_CURLY_BRACKET_OPEN) { r_err_str="Expected '{'"; return ERR_PARSE_ERROR; } return _parse_object(r_ret,str,idx,len,r_err_line,r_err_str); }