以下のような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"
}]
次のコードは、cJSON_CreateObject()
、cJSON_CreateArray()
、cJSON_AddItemToObject()
、cJSON_AddItemToArray()
などのcJSON関数の使用方法を示しています。
cars
配列をroot
オブジェクトに追加する必要があります。その後、各car
をCarType
とcarID
であるアイテムを含むオブジェクトとして作成する必要があります。各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
ループを使用してこれを行う必要があります。
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 );
私が得た別の解決策-
#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;
}