weixin_48842547 2024-09-02 19:21 采纳率: 0%
浏览 122
已结题

求解决为什么json数据完整,却解析失败

我打算对云平台上获取到的数据进行解析,但是出错了。当云平台下发数据,这里输出是这样的

img

但是经过复制到json解析网站是可以解析的

img

具体代码如下

img

 unsigned char *getjson(unsigned char *str, int size)
 {
     for (int i = 0; i < size; i++)
     {
         if (str[i] == '{')
          {
             return str + i;
          }
     }
     return NULL;
 }

void USART2_IRQHandler(void)
{
   
    //判断是否接收到数据
    if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
    {
        USART2_RxFlag = 1;
        //从串口外设接收数据  1次只能接收1个字节数据
        UART2_RxBuf[UART2_RxCnt++] = USART_ReceiveData(USART2); 
    }

}

 void json_pares(char *str)
 {
     cJSON *cjson_entire = NULL;
     cJSON *cjson_waterlevel = NULL;
     cJSON *cjson_feed = NULL;
     cJSON *cjson_waterpump = NULL;
     cJSON *cjson_weight = NULL;
     cJSON *cjson_params = NULL;
     cJSON *cjson_method = NULL;  

     printf("JSON数据:%s\r\n", str);
     cjson_entire = cJSON_Parse(str);

    
    if (cjson_entire == NULL)
    {
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL) {
            printf("Error before: %s\n", error_ptr);
        }
        printf("cjson_entire NULL\r\n");
    }
    else
    {
        printf("cjson_entire parsed successfully\r\n");
    }
     
     cjson_params = cJSON_GetObjectItem(cjson_entire, "params");
     cjson_method = cJSON_GetObjectItem(cjson_entire, "method");
     
//    char * data = cJSON_GetStringValue(cjson_params);
//    printf("cjson_params=%s\r\n",data);
     
     printf("====================JSON====================\n");
     if (cjson_method != NULL)
            printf("%s:%s\n", cjson_method->string, cjson_method->valuestring);
     
     if (cjson_params != NULL)
     {

        cjson_feed   = cJSON_GetObjectItem(cjson_params, "Feed");
        cjson_waterlevel = cJSON_GetObjectItem(cjson_params, "WaterLevel");
        cjson_waterpump  = cJSON_GetObjectItem(cjson_params, "Water");
        cjson_weight  = cJSON_GetObjectItem(cjson_params, "Weight");
        
          if (cjson_feed != NULL)
         {
             printf("%s:%d\n", cjson_feed->string, cjson_feed->valueint);
             if(cjson_feed->valueint)
             {
                is_feed_on = true;
                Forward_rotation(); // 开启喂食
                delay_ms(50);
                
             }
             else
             {
                is_feed_on = false;
                reversal(); //关闭喂食
                delay_ms(50);
             }
             
         }

         if (cjson_weight != NULL)
          {
              printf("%s:%d\n", cjson_weight->string, cjson_weight->valueint);
              
         }
          
         if (cjson_waterlevel != NULL)
          {
              printf("%s:%d\n", cjson_waterlevel->string, cjson_waterlevel->valueint);
              
         }
          
         if (cjson_waterpump != NULL)
          {
              printf("%s:%d\n", cjson_waterpump->string, cjson_waterpump->valueint);
              if(cjson_waterpump->valueint)
             {
                is_pump_on = true;
                GPIO_SetBits(GPIOG, GPIO_Pin_15); // 开启水泵
                delay_ms(50);
                
             }
             else
             {
                is_pump_on = false;
                GPIO_ResetBits(GPIOG, GPIO_Pin_15); // 关闭水泵
                delay_ms(50);
             }
         }
     }
     printf("====================================");
     cJSON_Delete(cjson_entire);
     printf("\r\n");
 }

  • 写回答

28条回答

  • 阿里嘎多学长 2024-09-02 19:21
    关注
    获得0.30元问题酬金

    AIGC生成:


    JSON数据完整却解析失败的原因分析

    你好,用户。根据你提供的信息,我可以看到你使用 C 语言获取云平台上的数据,然后尝试解析 JSON 数据,但是却出现了解析失败的问题。

    首先,我们需要检查一下 JSON 数据是否正确。从你提供的数据中,我可以看到数据的格式是正确的,但是可能存在一些特殊字符或编码问题。

    接下来,我们需要检查一下 C 语言代码是否正确。从你提供的代码中,我可以看到你使用了 unsigned char *getjson 函数来获取 JSON 数据,但是没有看到你使用哪个库或函数来解析 JSON 数据。

    可能的原因是:

    1. JSON 数据中的特殊字符或编码问题。
    2. C 语言代码中的解析错误。
    3. JSON 解析库或函数的使用错误。

    为了解决这个问题,我建议你可以尝试以下几点:

    1. 使用 JSON 解析库,如 json-crapidjson,来解析 JSON 数据。
    2. 检查 JSON 数据中的特殊字符或编码问题,确保它们是正确的。
    3. 检查 C 语言代码中的解析错误,确保它们是正确的。

    以下是一个使用 json-c 库来解析 JSON 数据的示例代码:

    #include <json-c/json.h>
    #include <stdio.h>
    
    int main() {
        json_object *json_obj = json_object_new_object();
        json_object_object_add(json_obj, "name", json_object_new_string("John"));
        json_object_object_add(json_obj, "age", json_object_new_int(30));
    
        FILE *fp = fopen("data.json", "w");
        json_object_to_file(fp, json_obj, JSON_C_TO_STRING_PRETTY);
        fclose(fp);
    
        json_object *json_data = json_object_from_file("data.json");
        if (json_data == NULL) {
            printf("Failed to parse JSON data\n");
            return -1;
        }
    
        json_object *name = json_object_object_get(json_data, "name");
        if (name == NULL) {
            printf("Failed to get name\n");
            return -1;
        }
    
        printf("Name: %s\n", json_object_get_string(name));
    
        json_object *age = json_object_object_get(json_data, "age");
        if (age == NULL) {
            printf("Failed to get age\n");
            return -1;
        }
    
        printf("Age: %d\n", json_object_get_int(age));
    
        json_object_free(json_data);
        return 0;
    }
    

    这个示例代码使用 json-c 库来创建一个 JSON 对象,然后将其写入到文件中,并从文件中读取 JSON 对象,最后解析 JSON 对象中的数据。

    我希望这个示例代码能够帮助你解决问题。如果你仍然遇到问题,请提供更多的信息和代码,我将尽力帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 创建了问题 9月2日