解析来自串行窗口的 json 响应

Posted

技术标签:

【中文标题】解析来自串行窗口的 json 响应【英文标题】:parsing json response from serial window 【发布时间】:2014-04-06 01:39:42 【问题描述】:

您好,我正在尝试从我的 arduino 中的网络服务器解析 JSON 响应,以便打开和关闭 LED 灯。我正在使用 wifi 客户端重复示例向我的服务器发出 get 请求:

http://arduino.cc/en/Tutorial/WiFiWebClientRepeating

这是我运行时从串口打印回来的内容

WiFiClient client;
   char c = client.read();
    Serial.write(c);

串口结果

connecting...
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 01:14:37 GMT
Server: Apache
X-Powered-By: php/5.5.10
Cache-Control: no-cache
X-Frame-Options: SAMEORIGIN
Set-Cookie: expires=Sun, 06-Apr-2014 03:14:37 GMT; Max-Age=7200; path=/; httponly
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

19
"lightstatus":"on"
0

如何仅解析此响应的 JSON 部分,以便可以使用它来控制我的 LED?

谢谢

【问题讨论】:

你为什么不直接从json对象开始解析呢? 什么意思?有没有从 WiFiClient 对象中只获取 JSON 的函数? 【参考方案1】:

好吧,即使是 JSON 也很难解析为 arduino。因此,您应该考虑尽可能简化响应,例如使用 1/0 整数而不是 "on"

你需要运行的,基本上是一个状态图:

if ('' == client.read())
  if ('"' == client.read())
    if ('l' == client.read())
      if ('i' == client.read())
        if ('g' == client.read())
          if ('h' == client.read())
            if ('t' == client.read())
              if ('s' == client.read())
                if ('t' == client.read())
                  if ('a' == client.read())
                    if ('t' == client.read())
                      if ('u' == client.read())
                        if ('s' == client.read())
                          if ('"' == client.read())
                            if (':' == client.read()) 
                               char c = client.read();
                               if (c == '1')
                                 // TURN LIGHT ON
                               else if (c == '0')
                                 // TURN LIGHT OFF
                            

可以通过使用字符串来改进,并将状态保存在索引变量中:

const char* VAL="\"lightstatus\":"

int parse_value(char c) 
    static int val_idx=0;
    // end of parsing condition, the index reached string length
    if (strlen(VAL) == val_idx) 
        // if the value is '1', return >0, if the value is '0', return 0
        if ('1' == c) return 1;
        else if ('0' == c) return 0;
    
    // otherwise let's check if we're still in string
    if (c == VAL[val_idx]) 
        // if we do, increment the index variable
        ++val_idx;
     else 
        // or reset it
        val_idx = 0;
    
    // return -1 while we're still parsing the string
    return -1;

使用该代码:

char val=-1;
while (val < 0)
    val = parse_value(Serial.read())

我没有测试它,但我希望你得到算法的想法!

HTH

【讨论】:

以上是关于解析来自串行窗口的 json 响应的主要内容,如果未能解决你的问题,请参考以下文章

无法解析来自谷歌的 json 响应

解析来自 StreamBuilder C# 的 JSON 响应

如何解析来自同一字段的多类型值的 json 响应?

在 Ruby 中解析来自 Eventbrite API 的 JSON 响应

如何解析来自 Bigquery 结果的 json 响应?

iOS Swift 解析来自 Alamofire 的 JSON 响应