web-dev-qa-db-ja.com

cJSON.hを使用してjsonオブジェクトを作成します

以下のようなJSONオブジェクトを作成しようとしていますが、2番目のアイテムを追加できません。例:

"CarType": "mercedes",
"carID": "merc123"

と他のアイテム。

次のようなJSONを作成したいと思います。

{
  cars: [
    {
      "CarType": "BMW",
      "carID": "bmw123"
    },
    {
      "CarType": "mercedes",
      "carID": "merc123"
    },
    {
      "CarType": "volvo",
      "carID": "vol123r"
    },
    {
      "CarType": "ford",
      "carID": "ford123"
    }
  ]
};

私はこれまで試しました:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int main (void){
    char field_name[32], value[32], *out;
    cJSON *root,*car;

    root  = cJSON_CreateObject();
    car=  cJSON_CreateArray();

    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("BMW"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("bmw123"));
    cJSON_AddItemToArray(car, root);

    out = cJSON_Print(car);
    printf("%s\n",out);

    return 0;
}

私の出力は次のようなものです(インデントはここに示されているとおりです):

[{
        "CarType":  "BMW",
        "carID":    "bmw123"
    }]
6
Abhishek

次のコードは、cJSON_CreateObject()cJSON_CreateArray()cJSON_AddItemToObject()cJSON_AddItemToArray()などのcJSON関数の使用方法を示しています。

cars配列をrootオブジェクトに追加する必要があります。その後、各carCarTypecarIDであるアイテムを含むオブジェクトとして作成する必要があります。各carオブジェクトをcars配列に追加する必要があります。

また、例を使用して非常によく文書化されています ここではGitHub

編集#1:

@JonnySchubertが指摘したように、割り当てられたリソースを解放する必要があります。ただし、この場合はルートノードを解放するだけで十分です。配列またはオブジェクトにアイテムを追加すると、その所有権が譲渡されるためです。つまり、ルートノードを解放すると、ルートの下にあるすべてのノードも解放されます。上でリンクしたGitHubリソースから:

すべての値型には、その型の項目を作成するために使用できるcJSON_Create...関数があります。これらはすべて、後でcJSON_Deleteで削除できるcJSON構造体を割り当てます。ある時点でそれらを削除する必要があることに注意してください。そうしないと、メモリリークが発生します。 重要:すでに配列またはオブジェクトにアイテムを追加している場合は、してはいけませんcJSON_Deleteで削除します。配列またはオブジェクトに追加すると、その所有権が譲渡されるため、その配列またはオブジェクトが削除されると、その配列も削除されます。

編集#2:

@lsalamonは、cJSON_Printの戻り値を解放する必要があると述べました。 ここではSOなど および ドキュメント を参照してください。

コード:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main()
{
   char *out;
   cJSON *root, *cars, *car;

   /* create root node and array */
   root = cJSON_CreateObject();
   cars = cJSON_CreateArray();

   /* add cars array to root */
   cJSON_AddItemToObject(root, "cars", cars);

   /* add 1st car to cars array */
   cJSON_AddItemToArray(cars, car = cJSON_CreateObject());
   cJSON_AddItemToObject(car, "CarType", cJSON_CreateString("BMW"));
   cJSON_AddItemToObject(car, "carID", cJSON_CreateString("bmw123"));

   /* add 2nd car to cars array */
   cJSON_AddItemToArray(cars, car = cJSON_CreateObject());
   cJSON_AddItemToObject(car, "CarType", cJSON_CreateString("mercedes"));
   cJSON_AddItemToObject(car, "carID", cJSON_CreateString("mercedes123"));

   /* print everything */
   out = cJSON_Print(root);
   printf("%s\n", out);
   free(out);

   /* free all objects under root and root itself */
   cJSON_Delete(root)

   return 0;
}

出力:

{
    "cars": [{
            "CarType":  "BMW",
            "carID":    "bmw123"
        }, {
            "CarType":  "mercedes",
            "carID":    "mercedes123"
        }]
}

このコードは、使用法を示すために2台の車を追加するだけです。実際のアプリケーションでは、C配列とforループを使用してこれを行う必要があります。

9
Andre Kampling

Json文字列が修正されている場合は、単にcJSON_Parse関数を使用できます。これを行うには、char*が必要です。

   const char* const json_string = 
"{ \
  \"cars\": [\
    {\
      \"CarType\": \"BMW\",\
      \"carID\": \"bmw123\"\
    },\
    {\
      \"CarType\": \"mercedes\",\
      \"carID\": \"merc123\"\
    },\
    {\
      \"CarType\": \"volvo\",\
      \"carID\": \"vol123r\"\
    },\
    {\
      \"CarType\": \"ford\",\
      \"carID\": \"ford123\"\
    }\
  ]\
}\
";

   cJSON * root = cJSON_Parse(json_string);  /* Play with root */

   //char *rendered = cJSON_Print(root);

リクエストに応じて更新、入力配列が固定されていない場合

   const char* const carType[] ={"BMW", "Mercides", "Audi", "Farari"}; 
   const char* const carID[]  ={"bmw11", "m22", "a33", "f44"} ;

   size_t max_size = 4;
   cJSON *root,*car;

   root  = cJSON_CreateObject();
   car=  cJSON_CreateArray();

   for( size_t i = 0; i < max_size; ++i )
   {
      cJSON* item  = cJSON_CreateObject(); 
      cJSON_AddItemToObject(item, "CarType", cJSON_CreateString( carType[i] ));
      cJSON_AddItemToObject(item, "carID", cJSON_CreateString(carID[i]));

      cJSON_AddItemToArray(car, item);
   }


   cJSON_AddItemToObject( root, "cars", car );
1
P0W

私が得た別の解決策-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int main (void){
    char field_name[32], value[32], *out;
    cJSON *root,*car;

    root  = cJSON_CreateObject();
    car=  cJSON_CreateArray();


    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("BMW"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("bmws123"));
    cJSON_AddItemToArray(car, root);

    root=NULL;
    root  = cJSON_CreateObject();

    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("Mercedies"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("mer123"));
    cJSON_AddItemToArray(car, root);



    out = cJSON_Print(car);
    printf("%s\n",out);


    return 0;
}
0
Abhishek