2020年1月9日
キーワード:cJSON、LinuxのJSONの解析
JSONは非常に一般的に軽量のデータ交換プロトコルのインターネットの分野で使用されています。
それはほとんどXMLの状態は、それはより多くの思考の私たちの習慣に沿ったものであるので、著者の観点から、私は、JSONのスタイルを好む、同じデータのコピー、XMLよりもJSON形式は、数をクリアすることです。
最近、私は非常に優れたオープンソースのコードを見つけるために、インターネットが食事を探して、C言語でJSONフォーマットを解析する必要があります。研究とその後の改正のバーストの後、私は最終的にJSONパーサーのC言語版には非常に便利になったそう。
著者は今少しメイクを自分にメモを与えたいし、コードの記録、それを修正して、ヘルプの学生が同じニーズを持っている第二に、私は願っています。
ソースコードとデモは、パックされた公園のネットワークディスクをブログに簡単です:
https://files.cnblogs.com/files/chorm590/C%E8%AF%AD%E8%A8%80%E8%A7%A3%E6%9E%90JSON%E7%A4%BA%E4%BE% 8B.zip
この圧縮ファイルには、ソースコードの2つのコピーが含まれています。
1、cJSONパーサおよび実施例に記載さreadmeファイルの元のバージョン
著者のサンプルコードによって変更2、
ここでは唯一の著者は説明し、簡単にコードを修正しました。
下に示すように、3つのコードファイルがあるの著者によって修正されたコードファイル:
demo.cデモンストレーションプログラムは、3つの一般的なJSONデータ形式とcJSONの使用を披露するその分析方法の合計を用意しました。全体のサンプルプログラムは非常に簡単ですが、学生はほとんどないが、その使用方法を理解読むことができるようになります。
このパーサーでは、JSONのすべてのノードがcJSONオブジェクト、すなわちcJSON構造に抽象化されています。
上記のように、このパーサに、JSON JSONアレイノードとターゲットノードが次、PREV、子ポインタ三つの変数縛ら。たびに迅速に対応するポインタ変数の三つの値を見つけるために使用できるオブジェクトのJSON JSON配列を解析することを含みます。
型は、可変のノードタイプで記録しました。あるいはタイプの値を以下に示します:
値ノードはvaluedoubleで、ここで、valueString、valueint中に保存しました。ブール値はvalueintとして格納されている場合。1は真を表し、偽は0を表します。
ノード自体の名前は、図に示されている文字列変数構造体cJSON構造に格納されます。
最後pure_json変数としては、追加する彼自身の著者です。その目的は、追加することですプレーンJSONテキストに余分な空白文字や改行文字を削除した後に保存します。はい、唯一のデフォルトcJSONパーサの解析JSONテキスト形式最も標準的な場合、以下のように:
下に示すように、レイアウトJSON形式の後に解決することはできません。
私は前述した「少し変更されたバージョンは、」JSONテキストは、この関数の発行後に添加することができる解析を意味します。私たちは、「書式」の後のテキストの後に簡単に、自由落下が不足し、このpur_string変数cJSON構造を追加することができます注文します。同時に、この形式の著者はまた、文字列値に空白文字や改行文字を残すことができます。
このJSONパーサーを使用する場合、元のJSON文字列が渡されただけにcJSON_Parse()関数は、自動的に再び文字列全体を解析し、対応するノードのリストを作成します。
それが原因の解析JSONに、しかし、注意しなければならない、あなたはそれらを使用して終わっているので、後にメモリを解放しなければなりません、メモリ空間を割り当てるためにmalloc関数を使用することです。単純すぎるリリースメモリ道、cJSON_Delete()関数は、することができ、引数として単純なルートノード。
パーサプロセスについては、興味のある学生はcJSON.cソースコードの実装を追跡行くことができます。それは複雑ではありません、私はここでは触れません。
あなたの時間は限られている場合は、直接参照するか、直接作者にサンプルコードを変更することができます。
最後に、著者のデモコードを貼り付けます。
#include <stdio.h> #include "cJSON.h" static void parse_normal_json(); static void parse_object_json(); static void parse_array_json(); int main() { printf("hello world\n"); parse_normal_json(); parse_object_json(); parse_array_json(); return 0; } static void parse_normal_json() { printf("\n\n\n>>> parse_normal_json()\n\n"); const char *json = "\n\ {\n\ \"key0\":\"Js on is a fun\nny data for mat!\",\n\ \"key1\":\"value1\",\n\ \"key2\":26,\n\ \"key3\":false\n\ }\n\ "; printf("json:\n%s\n\n", json); cJSON *root = cJSON_Parse(json); if(root == 0) { printf("error\n"); return; } cJSON *key0_node = cJSON_GetObjectItem(root, "key0"); if(key0_node == 0) return; printf("key0 name:\n\t%s\nkey0 value:\n\t%s\n", key0_node->string, key0_node->valuestring); cJSON *key1_node = cJSON_GetObjectItem(root, "key1"); if(key1_node == 0) return; printf("key1 value:\n\t%s\n", key1_node->valuestring); cJSON *key2_node = cJSON_GetObjectItem(root, "key2"); if(key2_node == 0) return; printf("key2 value:\n\t%d\n", key2_node->valueint); cJSON *key3_node = cJSON_GetObjectItem(root, "key3"); if(key3_node == 0) return; printf("key3 value:\n\t%d\n", key1_node->valueint); cJSON_Delete(root); } static void parse_object_json() { printf("\n\n\n>>> parse_object_json()\n\n"); const char *json = "\n\ {\n\ \"obj\":{\n\ \"key\":71,\n\ \"name\":22\n\ }\n\ }\n\ "; printf("json:\n%s\n\n", json); cJSON *root = cJSON_Parse(json); if(root == 0) { printf("error\n"); return; } cJSON *obj_node = cJSON_GetObjectItem(root, "obj"); if(obj_node == 0) return; cJSON *key_node = cJSON_GetObjectItem(obj_node, "key"); if(key_node == 0) return; printf("key value:\n\t%d\n", key_node->valueint); cJSON *child = obj_node->child; if(child == 0) return; printf("key name:\n\t%s\nkey value:\n\t%d\n", child->string, child->valueint); cJSON *name_node = child->next; if(name_node == 0) return; printf("name name:\n\t%s\nname value:\n\t%d\n", name_node->string, name_node->valueint); cJSON_Delete(root); } static void parse_array_json() { printf("\n\n\n>>> parse_array_json()\n\n"); const char *json = "\n\ {\n\ \"arrs\":[15,3,99,108,22]\n\ }\n\ "; printf("json:\n%s\n\n", json); cJSON *root = cJSON_Parse(json); if(root == 0) { printf("error\n"); return; } cJSON *arrs_node = cJSON_GetObjectItem(root, "arrs"); if(arrs_node == 0) return; if(arrs_node->type == cJSON_Array) { cJSON *node = arrs_node->child; int i = 0; while(node != 0) { printf("item%d:\n\t%d\n", i++, node->valueint); node = node->next; } } else { printf("arrs_node is not a json_array.\n"); } cJSON_Delete(root); }