Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从googleapi解码json数据_C_Json_Jansson - Fatal编程技术网

C 如何从googleapi解码json数据

C 如何从googleapi解码json数据,c,json,jansson,C,Json,Jansson,我在程序中使用下面的代码来获取纬度和经度 system("curl -d @gateway_req.json -H \"Content-Type: application/json\" -i \"https://www.googleapis.com/geolocation/v1/geolocate?key=MY_API_KEY"); 返回如下所示 HTTP/1.1 200 OK Content-Type: application/json; c

我在程序中使用下面的代码来获取纬度和经度

system("curl -d @gateway_req.json -H \"Content-Type: application/json\" -i \"https://www.googleapis.com/geolocation/v1/geolocate?key=MY_API_KEY");
返回如下所示

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: X-Origin
Vary: Referer
Date: Fri, 04 Sep 2020 16:15:39 GMT
Server: scaffolding on HTTPServer2
Cache-Control: private
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Alt-Svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=25                                                                                                             92000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2                                                                                                             592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Accept-Ranges: none
Vary: Origin,Accept-Encoding
Transfer-Encoding: chunked

{
  "location": {
    "lat": 20.7732224,
    "lng": -13.990144
  },
  "accuracy": 1030
}
我想分别解码
lat
lng
值,并将其存储在一个数组中


我已经安装了jansson lib,但不知道如何使用它。你能告诉我怎么做吗?

首先你需要找到有效载荷的起始点。这是在找到空行之后发生的

然后需要通过
json\u加载
解析字符串,然后接收一个根json对象。您要查找的数据存储在一个嵌入式对象
“location”
,您可以通过
json\u object\u get
检索该对象。 然后可以解析内容。这可以通过两种方式完成:

  • 您可以使用格式字符串来解析该对象的成员或
  • 可以获取location对象的子对象并检索每个子对象的值
工作完成后,需要减小引用计数器以释放对象

#包括
#包括
#包括
#包括
//gcc-o json测试`pkg-config--cflags-jansson`json.c`pkg-config--libs-jansson`
内部主(空)
{
FILE*input=fopen(“curl data.txt”、“rt”);
如果(输入==NULL){
fprintf(stderr,“无法打开curl data.txt。\n”);
返回1;
}
//示例数据有878个字节。
字符缓冲区[1024];
int num=fread(buffer,1,sizeof(buffer)-1,输入);
缓冲区[num]=0;
//在本例中,有效负载格式是已知的,我们可以直接搜索
//在HTTP中,数据包头和有效负载由一个空的
//行,可用于搜索有效负载的开始。
char*data_start=strstrstr(缓冲区“{”);
如果(数据开始==NULL){
fprintf(stderr,“未找到有效负载的开始。\n”);
返回1;
}
printf(“有效载荷:####\n%s\n###\n”,数据开始);
json_error_t err;
json_t*root=json_加载(数据开始、0和错误);
if(root==NULL){
fprintf(stderr,“无法分析输入字符串:%s\n”,错误文本);
返回1;
}
如果(!json_是_对象(根)){
fprintf(stderr,“根不是对象”\n);
json_decref(根);
返回1;
}
json_t*location=json_object_get(根,“位置”);
if(location==NULL | |!json_是_对象(location)){
fprintf(stderr,“未找到位置元素或不是对象”);
json_decref(根);
返回1;
}
双lat,液化天然气;
//备选案文1:
int res=json_unpack(位置“{s:f,s:f}”、“lat”、&lat、“lng”、&lng);
如果(res!=0){
fprintf(标准“未找到lat/lng元件”);
json_decref(根);
返回1;
}
printf(“1)纬度:%f;液化天然气:%f\n”,纬度,液化天然气);
//备选案文2:
json_t*latval=json_object_get(位置,“lat”);
如果(latval==NULL | | |!json_是真实的(latval)){
fprintf(stderr,“未找到lat元素或不是数字”);
json_decref(根);
返回1;
}
json_t*lngval=json_object_get(位置,“lng”);
如果(lngval==NULL | | |!json_是_real(lngval)){
fprintf(标准“未找到液化天然气元件或没有编号”);
json_decref(根);
返回1;
}
lat=json_编号_值(latval);
lng=json\u编号\u值(lngval);
printf(“2)纬度:%f;液化天然气:%f\n”,纬度,液化天然气);
json_decref(根);
返回0;
}

我需要深入阅读手册,看看您是否也需要为其他2个对象减少refcounter。

如果仍然存在问题,一些更新将是有用的。非常感谢您的帮助。它可以工作。有效负载的新行不一致。我已将数据\u start改为“{”,而不是“\n\n”。