前言
最近发现mysql数据库中支持json数据类型,所以在思考怎样把lpmud中的dbase内容以json形式存入数据库
经过各种努力,我把相关的sfun给初步探索出来了
半路出家,如有不合适,多多提点
最到的问题
我认为最大的问题就是lpmud中map的符号是([]),而在其他语言中(如javascript,java等)类似的数据格式是用花括号包围的{};因此,只能把map中的各个key-value对取出来,重新进行字符连接;
代码
string mapToJson(mapping m){
int i;
string str = "{";
mixed key;
if(!mapp(m)) return "{}";
//mysql中json不支持空逗号为结尾,会报错,所以只能判断map的大小,如果大于1个,那么最后一个必须考虑逗号问题;
if(sizeof(m)>1){
for(i=0;i< (sizeof(keys(m))-1);i++){
if(intp(m[keys(m)[i]])){
str += "\\\"" + keys(m)[i] + "\\\":" + m[keys(m)[i]] +",";
}else if(mapp(m[keys(m)[i])){//考虑map格式的值
str +="\\\"" + keys(m)[i]+"\\\":"+ mapToJson(m[keys(m)[i]]) +",";
}else{
str +="\\\""+ keys(m)[i] + "\\\":\\\"" + m[keys(m)[i]] +"\\\",";
}
}
}
//map中最后一组数据对处理;
if(intp(m[keys(m)[(sizeof(keys(m))-1)]])){
str +="\\\""+ keys(m)[(sizeof(keys(m))-1)] + "\\\":" + m[keys(m)[(sizeof(keys(m))-1)]] +"}";
}else if(mapp(m[keys(m)[(sizeof(keys(m))-1)]])){
str +="\\\"" + keys(m)[(sizeof(keys(m))-1)]+"\\\":"+ mapToJson(m[keys(m)[(sizeof(keys(m))-1)]])+"}";
}else{
str +="\\\""+ keys(m)[(sizeof(keys(m))-1)] + "\\\":\\\"" + m[keys(m)[(sizeof(keys(m))-1)]] +"\\\"}";
}
// str += "};
return str;
}
在test.c中(部分代码)
int main(object me, string arg)
{
// 请在此实现你的代码
object ob, ob1;
mixed ret;
string key,value,str;
mapping info=([]);
ob=me;
// my=ob->query_entire_dbase();
my = (["name":"tttina","info":(["hp":100,"mp":44]),"gender":"男"]);
tmy=ob->query_entire_temp_dbase();
str ="\""+ mapToJson(my)+"\"";//前后需要加引号
printf("str %s\n",str);
info["id"]=random(100)+2;
info["name"]="tina";
info["information"] =json_decode(str);
printf("info %O\n",info["information"]);
ret = F_DB->table("users")->insert(info);
// string jsonString = "{\"prefix\":\"ZJMUD\",\"msg\":\"helphelp\"}";
// mixed json = (["prefix":"ZJMUD","msg":"helphelphellp"]);
// write("json Result=" + json_encode(json) +"\n");
// printf("Result=%O\n",json_decode(jsonString));
printf("ret %O\n",ret);
if(!ret)write("error");
return ret;
}
此为返回结果

