2017-02-18 5 views
0
{ 
    "name":"John Doe", 
    "dob":"2005-01-03", 
    "scores": 
    { 
     "math": 
     { 
      "lowest":65, 
      "highest":98 
     }, 
     "english": 
     { 
      "lowest":75, 
      "highest":80 
     }, 
     "history": 
     { 
      "lowest":50, 
      "highest":85 
     } 
    } 
} 

json-cを使用して上記JSONオブジェクトの最高の数学スコアにアクセスする最も簡単な方法は何ですか?json-c:サブアレイから値にアクセスする最も簡単な方法

と同様のものを使用できますか?jsonobject_object_get(jsonobj、 "scores.math.highest")

もしそうでなければ、最高の得点を得るために個々の配列を検索する必要がありますか?すなわち、得点を得て、数学を学び、最終的に最高になる?

ありがとうございます!

+0

私はあなたが基本的なJavascriptと連想配列について学ぶ必要があると思います。 –

+0

JavascriptとJSONの使い方を知っています。私はどのようにC @ JSONの実装であるjson-cを使用して(最も単純な方法で)値にアクセスするかを尋ねています。 – Phil

+0

次に、Javascriptで連想配列について知っていますか?だから、Javascriptプログラムでは、どのようにリストのこれらの要素にアクセスしますか? C APIで同様のことを試してみたらどうでしょう? –

答えて

1

JSON-C docsを見ると、簡単に構造をドリルダウンすることはできません。あなたはそれを自分で行う必要があります。

struct json_object *json_object_get_with_keys(
    struct json_object *obj, 
    const char *keys[] 
) { 
    while(keys[0] != NULL) { 
     if(!json_object_object_get_ex(obj, keys[0], &obj)) { 
      fprintf(stderr, "Can't find key %s\n", keys[0]); 
      return NULL; 
     } 

     keys++; 
    } 

    return obj; 
} 

nullで終了するキー配列を渡すと、ドリルダウン(またはnull)されます。

const char *keys[] = {"scores", "math", "highest", NULL}; 
struct json_object *obj = json_object_get_with_keys(top, keys); 
if(obj != NULL) { 
    printf("%s\n", json_object_to_json_string(obj)); 
} 

代わりに、JSON-Glibを使用しています。それはJSONPathよりよく知られているでしょう、あなたは$.scores.english.highestを使用することができます。

JsonNode *result_node = json_path_query(
    "$.scores.english.highest", 
    json_parser_get_root(parser), 
    &error 
); 
if(error != NULL) { 
    fprintf(stderr, "%s", error->message); 
    exit(1); 
} 

/* It returns a node containing an array. Why doesn't it just return an array? */ 
JsonArray *results = json_node_get_array(result_node); 
if(json_array_get_length(results) == 1) { 
    printf("highest: %ld\n", json_array_get_int_element(results, 0)); 
} 
else { 
    fprintf(stderr, "Couldn't find it\n"); 
} 

これを使うのはちょっと厄介ですが、あなたは、いくつかのラッパー関数と簡単には足場とエラーハンドリングの世話をすることを確認することができます。

+0

申し訳ありません。私は有効なJSONファイルを使用しています。私は上記の例をタイプアウトしましたが、中括弧の代わりに角括弧を使用しました。私は例を修正しました。 – Phil

+0

@ Phil Ok。私はそれを答えで更新し、代わりにJSON-Glibを​​試してみることを勧めました。 – Schwern

+0

私はdocsでそれを見つけることができなかったのは私だけではなかったことをうれしく思っています。私はJSON-Glibが好きですが、私は今のところjson-cに固執することに決めました。私はあなたに似た機能を既に持っていますが、コードサンプルを提供してくれてありがとう。私はそれをテストし、それはうまく動作します。 – Phil

関連する問題