在C中解析JSON数组 [英] Parsing JSON array in C

查看:68
本文介绍了在C中解析JSON数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从服务器返回了以下JSON,并且我正在尝试访问 Values (时间戳/数据):

I have the following JSON returned from the server, and I'm trying to access to the Values (timestamp/data):

{
   "queries": [
     {
       "sample_size": 1,
       "results": [
         {
           "name": "data",
           "group_by": [
             {
               "name": "type",
               "type": "number"
             }
           ],
           "tags": {
             "hostname": [
               "host"
             ]
           },
           "values": [
             [
               1438775895302,
               143
             ]
           ]
         }
       ]
     }
   ]
 }

我正在使用 json-c ,并且使用 complete json parser .但是,当尝试使用 json_parse_array 访问 values 部分时,我总是遇到 segmentation错误(核心已转储).

I am using json-c, and am using slightly modified version of the complete json parser. However I keep getting a segmentation fault (core dumped) when attempting to access the values section using json_parse_array.

我该如何访问 values 部分?

推荐答案

感谢@wiseveri的技巧,并设法通过以下方式访问 values 部分:

Thanks @wiseveri for the tip, managed to access the values section with the following:

// gcc json_c_test.c -ljson-c -o json_c_test && clear && ./json_c_test

#include <json/json.h>
#include <stdio.h>

void json_parse_input( json_object *jobj )
{
    int exists, i, j, k, l;
    char *results;
    json_object *queriesObj, *resultsObj, *valuesObj, *tmpQueries, *tmpResults, *tmpValues, *tmpSeparateVals;

    /* Get query key */
    exists = json_object_object_get_ex( jobj, "queries", &queriesObj );
    if ( FALSE == exists )
    {
        printf( "\"queries\" not found in JSON\n" );
        return;
    }

    /* Loop through array of queries */
    for ( i = 0; i < json_object_array_length( queriesObj ); i++ )
    {
        tmpQueries = json_object_array_get_idx( queriesObj, i );

        /* Get results info */
        exists = json_object_object_get_ex( tmpQueries, "results", &resultsObj );
        if ( FALSE == exists )
        {
            printf( "\"results\" not found in JSON\n" );
            return;
        }

        /* Loop through array of results */
        for ( j = 0; j < json_object_array_length( resultsObj ); j++ )
        {
            tmpResults = json_object_array_get_idx ( resultsObj, j );

            /* Get values */
            exists = json_object_object_get_ex( tmpResults, "values", &valuesObj );
            if ( FALSE == exists )
            {
                printf( "\"values\" not found in JSON\n" );
                return;
            }

            /* Loop through array of array of values */
            for ( k = 0; k < json_object_array_length( valuesObj ); k++ )
            {
                tmpValues = json_object_array_get_idx ( valuesObj, k );

                /* Loop through array of values */
                for ( l = 0; l < json_object_array_length( tmpValues ); l++ )
                {
                    tmpSeparateVals = json_object_array_get_idx ( tmpValues, l );
                    printf( "Values:[%d] = %s \n", l, json_object_to_json_string( tmpSeparateVals ) );
                }
            }
        }
    }
}

int main()
{
    json_object *jobj;

    char * string = " { \"queries\" : [ { \"sample_size\" : 1, \"results\" : [ { \"name\" : \"data\", \"group_by\" : [{ \"name\" : \"type\", \"type\" : \"number\" }], \"tags\" : { \"hostname\" : [ \"host\" ]}, \"values\": [[1438775895302, 143]] } ], } ] } ";
    printf ( "JSON string: %s\n\n", string );

    jobj = json_tokener_parse( string );
    json_parse_input( jobj );
}

这篇关于在C中解析JSON数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆