数码之家

 找回密码
 立即注册
搜索
查看: 1419|回复: 2

[Arduino] C语言解析JSON(HeWearher)测试(nxjson)

[复制链接]
发表于 2022-2-11 13:23:12 | 显示全部楼层 |阅读模式
  1. //input是输入json
  2. const nx_json *root = nx_json_get(nx_json_parse_utf8((char*)input), "HeWeather5")->children.first; //HeWeather5
  3.         if (! root) {
  4.                 printf("parse json failed,root\n");
  5.                 return 0;
  6.         }
  7.         if(0!=strcmp("ok", nx_json_get(root, "status")->text_value)){// HeWeather5.status;
  8.                 printf("json status ! OK\n");
  9.                 return 0;
  10.         }

  11.         const nx_json *city, *basic, *now, *suggestion, *forecast, *tmp;
  12.        
  13.         city=nx_json_get(root->children.first, "city");//HeWeather5.aqi.city aqi->children.first;
  14.         printf("指数=%s ",  nx_json_get(city, "aqi")->text_value);//aqi,空气质量指数
  15.         printf("%s,", nx_json_get(city, "qlty")->text_value);//qlty
  16.         printf("co=%s,",   nx_json_get(city, "co")->text_value);  //co
  17.         printf("no2=%s,",  nx_json_get(city, "no2")->text_value); //no2
  18.         printf("o3=%s,",   nx_json_get(city, "o3")->text_value);  //o3
  19.         printf("pm10=%s,", nx_json_get(city, "pm10")->text_value);//pm10
  20.         printf("pm25=%s,", nx_json_get(city, "pm25")->text_value);//pm25
  21.         printf("so2=%s\n", nx_json_get(city, "so2")->text_value); //so2
  22.         // printf("%s-%s\n", city->children.first->key, city->children.first->text_value);        //aqi:"36"
  23.         // printf("%s-%s\n", city->children.first->next->key, city->children.first->next->text_value);//co:"0.8"
  24.        
  25.         basic=nx_json_get(root, "basic");
  26.         printf("更新:%s", nx_json_get(nx_json_get(basic, "update"), "loc")->text_value);//update
  27.         printf("@%s,%s,", nx_json_get(basic, "lat")->text_value, nx_json_get(basic, "lon")->text_value);//lat,lon
  28.         printf("%s,%s\n", nx_json_get(basic, "city")->text_value, nx_json_get(basic, "cnty")->text_value);//cnty
  29.        
  30.         now=nx_json_get(root, "now");
  31.         printf("即时: %s ", nx_json_get(nx_json_get(now, "cond"), "txt")->text_value);//cond
  32.         printf("%s℃,",   nx_json_get(now, "tmp")->text_value);//tmp
  33.         printf("%s%%,", nx_json_get(now, "hum")->text_value);//hum
  34.         printf("%spa,",  nx_json_get(now, "pres")->text_value);//pres
  35.         tmp=nx_json_get(now, "wind");
  36.         printf("wind:deg=%s/%s sc=%s %sm/s,",
  37.                 nx_json_get(tmp, "deg")->text_value,
  38.                 nx_json_get(tmp, "dir")->text_value,
  39.                 nx_json_get(tmp, "sc")->text_value,
  40.                 nx_json_get(tmp, "spd")->text_value);//wind
  41.         printf("vis=%s,",   nx_json_get(now, "vis")->text_value);//vis
  42.         printf("pcpn=%s,",  nx_json_get(now, "pcpn")->text_value);//pcpn
  43.         printf("dew=%s,",   nx_json_get(now, "dew")->text_value);//dew
  44.         printf("fl=%s\n",    nx_json_get(now, "fl")->text_value);//fl
  45.        
  46.         suggestion=nx_json_get(root, "suggestion");//生活指引
  47.         printf("空气=%s\n",    nx_json_get(nx_json_get(suggestion, "air"), "brf")->text_value);//air
  48.         printf("身感=%s\n",    nx_json_get(nx_json_get(suggestion, "comf"), "brf")->text_value);//comf
  49.         printf("穿着=%s,%s\n", nx_json_get(nx_json_get(suggestion, "drsg"), "brf")->text_value, nx_json_get(nx_json_get(suggestion, "drsg"), "txt")->text_value);//drsg
  50.         printf("运动=%s\n",    nx_json_get(nx_json_get(suggestion, "sport"), "brf")->text_value);//sport
  51.         printf("出行=%s\n",    nx_json_get(nx_json_get(suggestion, "trav"), "brf")->text_value);//trav
  52.         printf("紫外=%s\n",  nx_json_get(nx_json_get(suggestion, "uv"), "brf")->text_value);//uv
  53.        
  54.         forecast=nx_json_get(root, "daily_forecast")->children.first; //预报,一般有3天的预报
  55.         for(; forecast; forecast=forecast->next) {
  56.                 printf("%s ", nx_json_get(forecast, "date")->text_value);//date
  57.                 printf("%s|l%s ",  nx_json_get(nx_json_get(forecast, "cond"), "txt_d")->text_value, nx_json_get(nx_json_get(forecast, "cond"), "txt_n")->text_value);//cond
  58. //                printf("cloud=%s,", nx_json_get(forecast, "cloud")->text_value);//sr
  59.                 tmp=nx_json_get(forecast, "tmp");
  60.                 printf("%s-%s℃,", nx_json_get(tmp, "min")->text_value, nx_json_get(tmp, "max")->text_value);//tmp
  61.                 printf("%s%%,", nx_json_get(forecast, "hum")->text_value);//hum
  62.                 printf("%spa,",  nx_json_get(forecast, "pres")->text_value);//pres
  63.                 tmp=nx_json_get(forecast, "wind");
  64.                 printf("wind:dir=%s/%s sc=%s %sm/s,", nx_json_get(tmp, "deg")->text_value, nx_json_get(tmp, "dir")->text_value, nx_json_get(tmp, "sc")->text_value, nx_json_get(tmp, "spd")->text_value);//wind
  65.                 printf("vis=%s,",   nx_json_get(forecast, "vis")->text_value);//vis
  66.                 printf("pcpn=%s/",  nx_json_get(forecast, "pcpn")->text_value);//pcpn
  67.                 printf("%s%%,",   nx_json_get(forecast, "pop")->text_value);//pop
  68.                 printf("uv=%s,",    nx_json_get(forecast, "uv")->text_value);//uv
  69.                 tmp=nx_json_get(forecast, "astro");
  70.                 printf("s=%s-%s,", nx_json_get(tmp, "sr")->text_value, nx_json_get(tmp, "ss")->text_value);//sr
  71.                 printf("m=%s-%s", nx_json_get(tmp, "mr")->text_value, nx_json_get(tmp, "ms")->text_value);//mr
  72.                 printf("\n");
  73.         }

  74.         nx_json_free(root);
  75.         nx_json_free(city);
  76.         nx_json_free(basic);
  77.         nx_json_free(now);
  78.         nx_json_free(suggestion);
  79.         nx_json_free(forecast);
  80.         nx_json_free(tmp);
复制代码
有一定注释,放到notepad++那样的编辑器,会比较容易查看。几乎是全解析了,取所需要的field显示就是了。

最近气温偏低,于是就想经常看看天气。手机的天气也可以,但参数不够多。

选择缘由:nxjson 来源github上(多刷新几次,能取到),是轻量级,直接引用源文件,不必编译成库文件。可以逐个枚举,也可以按名称选取,比较方便。通用、方便移植(对单片机有些困难,但对一般的arm/arduino级别的,应该不吃力)。
clone下来后附带有测试案例、有编译说明,等,比较详细。

作者说明:
Very small JSON parser written in C.
## Features
- Parses JSON from null-terminated string
- Easy to use tree traversal API
- Allows // line and /\* block \*/ comments (except before colon ':')
- Operates on single-byte or multi-byte characters (like UTF-8), but not on wide characters
- Unescapes string values (including Unicode codepoints & surrogates)
- Can use custom Unicode encoder, UTF-8 encoder built in
- Can use custom memory allocator
- Can use custom macro to print errors
- Test suite included

## Limitations
- Non-validating parser; might accept invalid JSON (eg., extra or missing commas, comments, octal or hex numeric values, etc.)



在ubuntu上测试结果
谨作例子指引,谢谢观看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +40 收起 理由
家睦 + 40

查看全部打赏

 楼主| 发表于 2022-2-12 05:03:03 | 显示全部楼层


Linux 2.6.32.16 #136 Fri Feb 4 11:20:00 CST 2022 armv4tl GNU/Linux

重新嵌入编译,在ARM LINUX上执行



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2022-9-9 17:06:58 | 显示全部楼层
大牛,收下膝盖。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-10 02:50 , Processed in 0.592801 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表