标签 JSON 下的文章

wrong logic in yajl_tree_get (returns NULL even when val exists)

用yajl不要用主页(lloyd.github.com/yajl/)的2.0.1,已经很久没有更新了,有个致命bug,如标题所说。

ISSUE:https://github.com/lloyd/yajl/issues/52

SO上的讨论:http://stackoverflow.com/questions/7309992/parsing-json-with-yajl-in-c

简而言之,第一个key存在,但是值返回NULL。

此commit已经fix 9c2948a33165c650122d131f31140c15321908f5

请用git clone git://github.com/lloyd/yajl.git 保持更新。

转换字符串为16进制int /转换json \uXXXX码为可识别的中文 [C语言]

#include <stdio.h>
int i;
char *str1 =  "cdef";
sscanf(str1,"%x",&i);
printf("%x
",i);

str1是需要转换成16进制int型的字符串。最后将"cdef"转为0xcdef。

有些人问这个有什么鸟用呢。

其实总所周知javascript object notation表示cjk字符串的形式是:uXXXX,XX都是0~15(0~F)的数字。

使用如下代码:

DWORD dwNum;
WCHAR str[10]={0};
char str2[10]={0};
str[0] = 0x751f;//生
str[1] = 0x65e5;//日
str[2] = 0x5feb;//快
str[3] = 0x4e50;//乐
str[4] = 0x0001;//
dwNum = WideCharToMultiByte(CP_OEMCP,0,(LPCWSTR)str,-1,NULL,0,NULL,FALSE);
WideCharToMultiByte (CP_OEMCP,0,(LPCWSTR)str,-1,str2,dwNum,NULL,FALSE);
printf("%s",str2);

转换字符串为16进制int /转换json uXXXX码为可识别的中文 [C语言]

如果要生成unicode表(0x0000~0xFFFF),可以使用以下代码:

#include <windows.h>
#include <stdio.h>
void main()
{   
    DWORD dwNum;
    char str2[10];
    int i;
    WCHAR str[100];
    FILE *fp;
    ZeroMemory(str,0xf);
    fp = fopen("c:ansi.txt","w+");
    for(i=0;i<0xffff;i++)
    {
        *str=i;
        
        dwNum = WideCharToMultiByte(CP_OEMCP,0,(LPCWSTR)str,-1,NULL,0,NULL,FALSE);
        WideCharToMultiByte (CP_OEMCP,0,(LPCWSTR)str,-1,str2,dwNum,NULL,FALSE);
        fprintf(fp,"%s",str2);
    }
}

生成的ansi.txt大概有85kB:

转换字符串为16进制int /转换json uXXXX码为可识别的中文 [C语言]

如果直接fprintf str的话:

int i;
WCHAR str[100];
FILE *fp;
ZeroMemory(str,0xf);
fp = fopen("c:unicode.txt","w+");
for(i=0;i<0xffff;i++)
{
    *str=i;
    fprintf(fp,"%s",(LPCWSTR)str);
}

输出的unicode.txt大小128kB,有各国的文字,armania,阿拉伯,泰文之类的...

一个将数据库结果集转换为JSON编码的方法

代码片段

public function getSentBox($empId)
{
$sql=sprintf("select * from %smail_status ms left join %smail m on ms.mailid=m.mailid and fromid=%s",SQLPREFIX,SQLPREFIX,$empId);
$stmt=$this->db->query($sql);
$rows=array();
while(($r=$this->db->fetch_assoc($stmt)) == true){
$rows[]=$r;
}
return json_encode($rows);
}

开始傻傻的想通过每行数据利用字符拼凑起来,但是方法繁琐。 在

SO上发现此奇技淫巧,将结果集先转换成二维数组,然后json_encode之。 返回合法json数据:

[{
"MAILID": "1",
"FROMID": "1",
"FROMSTATUS": "sent",
"FROMNAME": "\u7ba1\u7406\u5458",
"TOID": "2",
"TOSTATUS": "unread",
"TONAME": "\u5f20\u4e09",
"SENDTIME": "2010-05-07",
"MAILTITLE": "\u6807\u9898",
"MAILCONTENT": "\u5185\u5bb9"
}, {
"MAILID": "1",
"FROMID": "1",
"FROMSTATUS": "sent",
"FROMNAME": "\u7ba1\u7406\u5458",
"TOID": "2",
"TOSTATUS": "read",
"TONAME": "\u5f20\u4e09",
"SENDTIME": "2010-05-07",
"MAILTITLE": "\u6807\u9898",
"MAILCONTENT": "\u5185\u5bb9"
}]

asp解析json

第一种方法:在服务器上运行jscript

<script language="JScript" runat="Server">
function toObject(json) {
eval("var o=" + json);
return o;
}
</script>
<%

Dim json
json = "{'uid':'1','username':'abc','email':'123@163.com'}"
Set json = toObject(json)

Response.Write json.uid & "<br/>"
Response.Write json.username & "<br />"
Response.Write json.email & "<br />"

Set json = Nothing
%>

第二种方法:使用MSScriptControl.ScriptControl,和第一种方法类似,只是在不同的环境下执行js。

这里有一个例子和parser。 第三种方法:另外一个parser。 第四种方法:使用aspjson