Skip to content

Latest commit

 

History

History
590 lines (441 loc) · 27 KB

README.md

File metadata and controls

590 lines (441 loc) · 27 KB

cJSON

Ultralightweight JSON parser in ANSI C.
ANSI C の超軽量 JSON パーサー。

Table of contents
目次

License

MIT License
MITライセンス

Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
著作権 (c) 2009-2017 Dave Gamble および cJSON 貢献者

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。

Usage
使用法

Welcome to cJSON.
cJSON へようこそ。

cJSON aims to be the dumbest possible parser that you can get your job done with.
cJSON は、仕事を遂行できる限り最も愚かなパーサーを目指しています。
It's a single file of C, and a single header file.
これは C の 1 つのファイルと 1 つのヘッダー ファイルです。

JSON is described best here: http://www.json.org/
JSON については、http://www.json.org/ で最もよく説明されています。
It's like XML, but fat-free.
XML に似ていますが、脂肪は含まれません。
You use it to move data around, store things, or just generally represent your program's state.
データを移動したり、保存したり、プログラムの状態を一般的に表すために使用します。

As a library, cJSON exists to take away as much legwork as it can, but not get in your way.
cJSON はライブラリとして、邪魔にならずにできる限り作業を軽減するために存在します。
As a point of pragmatism (i.e. ignoring the truth), I'm going to say that you can use it in one of two modes: Auto and Manual.
実用主義 (つまり、真実を無視) の観点から、自動と手動の 2 つのモードのいずれかで使用できると言いたいと思います。
Let's have a quick run-through.
簡単に見ていきましょう。

I lifted some JSON from this page: http://www.json.org/fatfree.html
このページから一部の JSON を引用しました: http://www.json.org/fatfree.html
That page inspired me to write cJSON, which is a parser that tries to share the same philosophy as JSON itself.
このページが私に cJSON を書くきっかけを与えました。cJSON は、JSON 自体と同じ哲学を共有しようとするパーサーです。
Simple, dumb, out of the way.
シンプルで、バカで、邪魔にならない。

Building

There are several ways to incorporate cJSON into your project.
cJSON をプロジェクトに組み込む方法はいくつかあります。

copying the source
ソースをコピーする

Because the entire library is only one C file and one header file, you can just copy cJSON.h and cJSON.c to your projects source and start using it.
ライブラリ全体は 1 つの C ファイルと 1 つのヘッダー ファイルだけであるため、cJSON.h と cJSON.c をプロジェクトのソースにコピーするだけで使用を開始できます。

cJSON is written in ANSI C (C89) in order to support as many platforms and compilers as possible.
cJSON は、できるだけ多くのプラットフォームとコンパイラをサポートするために、ANSI C (C89) で書かれています。

CMake

With CMake, cJSON supports a full blown build system.
CMake を使用すると、cJSON は本格的なビルド システムをサポートします。
This way you get the most features.
このようにして、ほとんどの機能を利用できます。
CMake with an equal or higher version than 2.8.5 is supported.
2.8.5 以降のバージョンの CMake がサポートされています。
With CMake it is recommended to do an out of tree build, meaning the compiled files are put in a directory separate from the source files.
CMake では、ツリー外ビルドを実行することをお勧めします。つまり、コンパイルされたファイルはソース ファイルとは別のディレクトリに置かれます。
So in order to build cJSON with CMake on a Unix platform, make a build directory and run CMake inside it.
したがって、Unix プラットフォームで CMake を使用して cJSON をビルドするには、ビルド ディレクトリを作成し、その中で CMake を実行します。

mkdir build
cd build
cmake ..

This will create a Makefile and a bunch of other files. You can then compile it:
これにより、Makefile とその他のファイルが多数作成されます。その後、それをコンパイルできます。

make

And install it with make install if you want.
必要に応じて make install でインストールします。
By default it installs the headers /usr/local/include/cjson and the libraries to /usr/local/lib.
デフォルトでは、ヘッダー /usr/local/include/cjson とライブラリーが /usr/local/lib にインストールされます。
It also installs files for pkg-config to make it easier to detect and use an existing installation of CMake.
また、pkg-config のファイルもインストールされ、CMake の既存のインストールを簡単に検出して使用できるようになります。
And it installs CMake config files, that can be used by other CMake based projects to discover the library.
また、他の CMake ベースのプロジェクトがライブラリを検出するために使用できる CMake 構成ファイルがインストールされます。

You can change the build process with a list of different options that you can pass to CMake.
CMake に渡すことができるさまざまなオプションのリストを使用して、ビルド プロセスを変更できます。
Turn them on with On and off with Off:
On でオンにし、Off でオフにします。

  • -DENABLE_CJSON_TEST=On: Enable building the tests. (on by default)
    テストの構築を有効にします。 (デフォルトでオン)
  • -DENABLE_CJSON_UTILS=On: Enable building cJSON_Utils. (off by default)
    cJSON_Utils の構築を有効にします。 (デフォルトではオフ)
  • -DENABLE_TARGET_EXPORT=On: Enable the export of CMake targets. Turn off if it makes problems. (on by default)
    CMake ターゲットのエクスポートを有効にします。問題がある場合はオフにしてください。 (デフォルトでオン)
  • -DENABLE_CUSTOM_COMPILER_FLAGS=On: Enable custom compiler flags (currently for Clang, GCC and MSVC). Turn off if it makes problems. (on by default)
    カスタム コンパイラ フラグを有効にします (現在は Clang、GCC、MSVC 用)。問題がある場合はオフにしてください。 (デフォルトでオン)
  • -DENABLE_VALGRIND=On: Run tests with valgrind. (off by default)
    valgrind を使用してテストを実行します。 (デフォルトではオフ)
  • -DENABLE_SANITIZERS=On: Compile cJSON with AddressSanitizer and UndefinedBehaviorSanitizer enabled (if possible). (off by default)
    (可能な場合は) AddressSanitizer と UnknownBehaviorSanitizer を有効にして cJSON をコンパイルします。 (デフォルトではオフ)
  • -DENABLE_SAFE_STACK: Enable the SafeStack instrumentation pass. Currently only works with the Clang compiler. (off by default)
    SafeStack インストルメンテーション パスを有効にします。現在、Clang コンパイラでのみ動作します。 (デフォルトではオフ)
  • -DBUILD_SHARED_LIBS=On: Build the shared libraries. (on by default)
    共有ライブラリを構築します。 (デフォルトでオン)
  • -DBUILD_SHARED_AND_STATIC_LIBS=On: Build both shared and static libraries. (off by default)
    共有ライブラリと静的ライブラリの両方を構築します。 (デフォルトではオフ)
  • -DCMAKE_INSTALL_PREFIX=/usr: Set a prefix for the installation.
    インストールのプレフィックスを設定します。
  • -DENABLE_LOCALES=On: Enable the usage of localeconv method. ( on by default )
    localeconv メソッドの使用を有効にします。 (デフォルトでオン)
  • -DCJSON_OVERRIDE_BUILD_SHARED_LIBS=On: Enable overriding the value of BUILD_SHARED_LIBS with -DCJSON_BUILD_SHARED_LIBS.
    -DCJSON_BUILD_SHARED_LIBS による BUILD_SHARED_LIBS の値の上書きを有効にします。
  • -DENABLE_CJSON_VERSION_SO: Enable cJSON so version. ( on by default )
    cJSON のバージョンを有効にします。 (デフォルトでオン)

If you are packaging cJSON for a distribution of Linux, you would probably take these steps for example:
Linux ディストリビューション用に cJSON をパッケージ化する場合は、たとえば次の手順を実行することになるでしょう。

mkdir build
cd build
cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr
make
make DESTDIR=$pkgdir install

On Windows CMake is usually used to create a Visual Studio solution file by running it inside the Developer Command Prompt for Visual Studio, for exact steps follow the official documentation from CMake and Microsoft and use the online search engine of your choice.
Windows では、CMake は通常、Visual Studio の開発者コマンド プロンプト内で実行することで Visual Studio ソリューション ファイルを作成するために使用されます。正確な手順については、CMake および Microsoft の公式ドキュメントに従い、選択したオンライン検索エンジンを使用します。
The descriptions of the the options above still generally apply, although not all of them work on Windows.
上記のオプションの説明は一般的に当てはまりますが、すべてが Windows で動作するわけではありません。

Makefile

NOTE: This Method is deprecated.
注: このメソッドは廃止されました。
Use CMake if at all possible.
可能であれば CMake を使用してください。
Makefile support is limited to fixing bugs.
Makefile のサポートはバグの修正に限定されています。

If you don't have CMake available, but still have GNU make.
CMake は利用できないが、GNU make はまだある場合。
You can use the makefile to build cJSON:
Makefile を使用して cJSON を構築できます。

Run this command in the directory with the source code and it will automatically compile static and shared libraries and a little test program (not the full test suite).
ソース コードのあるディレクトリでこのコマンドを実行すると、静的ライブラリと共有ライブラリ、および小さなテスト プログラム (完全なテスト スイートではない) が自動的にコンパイルされます。

make all

If you want, you can install the compiled library to your system using make install.
必要に応じて、make install を使用してコンパイルされたライブラリをシステムにインストールできます。
By default it will install the headers in /usr/local/include/cjson and the libraries in /usr/local/lib.
デフォルトでは、ヘッダーは /usr/local/include/cjson にインストールされ、ライブラリは /usr/local/lib にインストールされます。
But you can change this behavior by setting the PREFIX and DESTDIR variables: make PREFIX=/usr DESTDIR=temp install.
ただし、PREFIX 変数と DESTDIR 変数を設定することでこの動作を変更できます。make PREFIX=/usr DESTDIR=temp install とします。
And uninstall them with: make PREFIX=/usr DESTDIR=temp uninstall.
そして、make PREFIX=/usr DESTDIR=temp uninstall を実行してアンインストールします。

Meson

To make cjson work in a project using meson, the libcjson dependency has to be included:
meson を使用するプロジェクトで cjson を動作させるには、libcjson 依存関係を含める必要があります。

project('c-json-example', 'c')

cjson = dependency('libcjson')

example = executable(
    'example',
    'example.c',
    dependencies: [cjson],
)

Vcpkg

You can download and install cJSON using the vcpkg dependency manager:
vcpkg 依存関係マネージャーを使用して cJSON をダウンロードしてインストールできます。

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install cjson

The cJSON port in vcpkg is kept up to date by Microsoft team members and community contributors.
vcpkg の cJSON ポートは、Microsoft チームのメンバーとコミュニティの貢献者によって最新の状態に保たれます。
If the version is out of date, please create an issue or pull request on the vcpkg repository.
バージョンが古い場合は、vcpkg リポジトリで問題を作成するか、プル リクエストを作成してください。

Including cJSON

If you installed it via CMake or the Makefile, you can include cJSON like this:
CMake または Makefile 経由でインストールした場合は、次のように cJSON を含めることができます。

#include <cjson/cJSON.h>

Data Structure

cJSON represents JSON data using the cJSON struct data type:
cJSON は、cJSON struct データ型を使用して JSON データを表します。

/* The cJSON structure: */
typedef struct cJSON
{
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;
    int type;
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    double valuedouble;
    char *string;
} cJSON;

An item of this type represents a JSON value.
このタイプの項目は JSON 値を表します。
The type is stored in type as a bit-flag (this means that you cannot find out the type by just comparing the value of type).
型はビットフラグとして type に格納されます (つまり、type の値を比較するだけでは型を見つけることはできません)。

To check the type of an item, use the corresponding cJSON_Is... function.
項目のタイプを確認するには、対応する cJSON_Is... 関数を使用します。
It does a NULL check followed by a type check and returns a boolean value if the item is of this type.
NULL チェックに続いてタイプ チェックを実行し、項目がこのタイプの場合はブール値を返します。

The type can be one of the following:

  • cJSON_Invalid (check with cJSON_IsInvalid): Represents an invalid item that doesn't contain any value.
    cJSON_Invalid (cJSON_IsInvalid で確認): 値が含まれていない無効な項目を表します。
    You automatically have this type if you set the item to all zero bytes.
    項目をすべてゼロバイトに設定すると、自動的にこのタイプになります。
  • cJSON_False (check with cJSON_IsFalse): Represents a false boolean value.
    cJSON_False (cJSON_IsFalse で確認): false のブール値を表します。
    You can also check for boolean values in general with cJSON_IsBool.
    cJSON_IsBool を使用して一般にブール値をチェックすることもできます。
  • cJSON_True (check with cJSON_IsTrue): Represents a true boolean value.
    cJSON_True (cJSON_IsTrue で確認): true のブール値を表します。
    You can also check for boolean values in general with cJSON_IsBool.
    cJSON_IsBool を使用して一般にブール値をチェックすることもできます。
  • cJSON_NULL (check with cJSON_IsNull): Represents a null value.
    cJSON_NULL (cJSON_IsNull で確認): null 値を表します。
  • cJSON_Number (check with cJSON_IsNumber): Represents a number value.
    cJSON_Number (cJSON_IsNumber で確認): 数値を表します。
    The value is stored as a double in valuedouble and also in valueint.
    値は、valuedouble および valueint にも double として格納されます。
    If the number is outside of the range of an integer, INT_MAX or INT_MIN are used for valueint.
    数値が整数の範囲外の場合、valueint には INT_MAX または INT_MIN が使用されます。
  • cJSON_String (check with cJSON_IsString): Represents a string value.
    cJSON_String (cJSON_IsString で確認): 文字列値を表します。
    It is stored in the form of a zero terminated string in valuestring.
    これは、ゼロで終了する文字列の形式で valuestring に格納されます。
  • cJSON_Array (check with cJSON_IsArray): Represent an array value.
    cJSON_Array (cJSON_IsArray で確認): 配列値を表します。
    This is implemented by pointing child to a linked list of cJSON items that represent the values in the array.
    これは、配列内の値を表す cJSON 項目のリンクされたリストを子にポイントすることによって実装されます。
    The elements are linked together using next and prev, where the first element has prev.next == NULL and the last element next == NULL.
    要素は next と prev を使用してリンクされます。最初の要素は prev.next == NULL、最後の要素は next == NULL になります。
  • cJSON_Object (check with cJSON_IsObject): Represents an object value.
    cJSON_Object (cJSON_IsObject で確認): オブジェクトの値を表します。
    Objects are stored same way as an array, the only difference is that the items in the object store their keys in string.
    オブジェクトは配列と同じ方法で保存されますが、唯一の違いは、オブジェクト内の項目がキーを文字列に保存することです。
  • cJSON_Raw (check with cJSON_IsRaw): Represents any kind of JSON that is stored as a zero terminated array of characters in valuestring.
    cJSON_Raw (cJSON_IsRaw で確認): valuestring 内のゼロで終了する文字配列として保存されている任意の種類の JSON を表します。
    This can be used, for example, to avoid printing the same static JSON over and over again to save performance.
    これは、たとえば、パフォーマンスを節約するために同じ静的 JSON を何度も印刷することを避けるために使用できます。
    cJSON will never create this type when parsing.
    cJSON は解析時にこの型を作成しません。
    Also note that cJSON doesn't check if it is valid JSON.
    また、cJSON は有効な JSON であるかどうかをチェックしないことに注意してください。

Additionally there are the following two flags:
さらに、次の 2 つのフラグがあります。

  • cJSON_IsReference: Specifies that the item that child points to and/or valuestring is not owned by this item, it is only a reference.
    cJSON_IsReference: 子が指す項目および/または値文字列がこの項目によって所有されておらず、単なる参照であることを指定します。
    So cJSON_Delete and other functions will only deallocate this item, not its child/valuestring.
    したがって、cJSON_Delete および他の関数は、この項目の割り当てを解除するだけであり、その子/値文字列は割り当てません。
  • cJSON_StringIsConst: This means that string points to a constant string.
    cJSON_StringIsConst: これは、文字列が定数文字列を指していることを意味します。
    This means that cJSON_Delete and other functions will not try to deallocate string.
    これは、cJSON_Delete および他の関数が文字列の割り当てを解除しようとしないことを意味します。

Working with the data structure
データ構造の操作

For every value type there is a cJSON_Create... function that can be used to create an item of that type.
すべての値の型に対して、その型の項目の作成に使用できる cJSON_Create... 関数があります。
All of these will allocate a cJSON struct that can later be deleted with cJSON_Delete.
これらはすべて、後で cJSON_Delete で削除できる cJSON 構造体を割り当てます。
Note that you have to delete them at some point, otherwise you will get a memory leak.
ある時点でそれらを削除する必要があることに注意してください。そうしないと、メモリ リークが発生します。

Important: If you have added an item to an array or an object already, you mustn't delete it with cJSON_Delete.
重要: すでに配列またはオブジェクトに項目を追加している場合は、cJSON_Delete を使用して項目を削除しないでください。
Adding it to an array or object transfers its ownership so that when that array or object is deleted, it gets deleted as well.
それを配列またはオブジェクトに追加すると、その所有権が譲渡されるため、その配列またはオブジェクトが削除されると、それも削除されます。
You also could use cJSON_SetValuestring to change a cJSON_String's valuestring, and you needn't to free the previous valuestring manually.
cJSON_SetValuestring を使用して cJSON_String の値文字列を変更することもでき、以前の値文字列を手動で解放する必要はありません。

Basic types

  • null is created with cJSON_CreateNull
    null は cJSON_CreateNull で作成されます
  • booleans are created with cJSON_CreateTrue, cJSON_CreateFalse or cJSON_CreateBool
    ブール値は cJSON_CreateTrue、cJSON_CreateFalse、または cJSON_CreateBool で作成されます
  • numbers are created with cJSON_CreateNumber.
    数値は cJSON_CreateNumber で作成されます。
    This will set both valuedouble and valueint.
    これにより、valuedouble と valueint の両方が設定されます。
    If the number is outside of the range of an integer, INT_MAX or INT_MIN are used for valueint
    数値が整数の範囲外の場合、valueint には INT_MAX または INT_MIN が使用されます。
  • strings are created with cJSON_CreateString (copies the string) or with cJSON_CreateStringReference (directly points to the string.
    文字列は、cJSON_CreateString (文字列をコピー) または cJSON_CreateStringReference (文字列を直接指定) を使用して作成されます。
    This means that valuestring won't be deleted by cJSON_Delete and you are responsible for its lifetime, useful for constants)
    これは、valuestring が cJSON_Delete によって削除されず、その有効期間に対して責任があることを意味します (定数に役立ちます)。

Arrays

You can create an empty array with cJSON_CreateArray.
>cJSON_CreateArray を使用して空の配列を作成できます。
cJSON_CreateArrayReference can be used to create an array that doesn't "own" its content, so its content doesn't get deleted by cJSON_Delete.
cJSON_CreateArrayReference を使用すると、その内容を「所有」しない配列を作成できるため、その内容が cJSON_Delete によって削除されなくなります。

To add items to an array, use cJSON_AddItemToArray to append items to the end.
配列に項目を追加するには、cJSON_AddItemToArray を使用して項目を末尾に追加します。
Using cJSON_AddItemReferenceToArray an element can be added as a reference to another item, array or string.
cJSON_AddItemReferenceToArray を使用すると、要素を別の項目、配列、または文字列への参照として追加できます。
This means that cJSON_Delete will not delete that items child or valuestring properties, so no double frees are occurring if they are already used elsewhere.
これは、cJSON_Delete がその項目の子プロパティまたは valuestring プロパティを削除しないことを意味するため、それらがすでに他の場所で使用されている場合でも二重解放は発生しません。
To insert items in the middle, use cJSON_InsertItemInArray.
項目を中央に挿入するには、cJSON_InsertItemInArray を使用します。
It will insert an item at the given 0 based index and shift all the existing items to the right.
指定された 0 ベースのインデックスに項目を挿入し、既存のすべての項目を右にシフトします。

If you want to take an item out of an array at a given index and continue using it, use cJSON_DetachItemFromArray, it will return the detached item, so be sure to assign it to a pointer, otherwise you will have a memory leak.
特定のインデックスにある配列から項目を取り出して使用し続けたい場合は、cJSON_DetachItemFromArray を使用します。これにより、切り離された項目が返されるため、必ずポインターに割り当ててください。そうしないと、メモリ リークが発生します。

Deleting items is done with cJSON_DeleteItemFromArray.
項目の削除は cJSON_DeleteItemFromArray で行われます。
It works like cJSON_DetachItemFromArray, but deletes the detached item via cJSON_Delete.
これは cJSON_DetachItemFromArray と同様に機能しますが、cJSON_Delete を介して切り離された項目を削除します。

You can also replace an item in an array in place.
配列内の項目をその場で置き換えることもできます。
Either with cJSON_ReplaceItemInArray using an index or with cJSON_ReplaceItemViaPointer given a pointer to an element.
インデックスを使用する cJSON_ReplaceItemInArray を使用するか、要素へのポインターを指定した cJSON_ReplaceItemViaPointer を使用します。
cJSON_ReplaceItemViaPointer will return 0 if it fails.
cJSON_ReplaceItemViaPointer は失敗すると 0 を返します。
What this does internally is to detach the old item, delete it and insert the new item in its place.
これが内部的に行うことは、古い項目をデタッチして削除し、その場所に新しい項目を挿入することです。

To get the size of an array, use cJSON_GetArraySize.
配列のサイズを取得するには、cJSON_GetArraySize を使用します。
Use cJSON_GetArrayItem to get an element at a given index.
cJSON_GetArrayItem を使用して、指定されたインデックスの要素を取得します。

Because an array is stored as a linked list, iterating it via index is inefficient (O(n²)), so you can iterate over an array using the cJSON_ArrayForEach macro in O(n) time complexity.
配列はリンク リストとして保存されるため、インデックスによる反復処理は非効率的 (O(n²)) であるため、cJSON_ArrayForEach マクロを使用して配列を O(n) の時間計算量で反復処理できます。

Objects

You can create an empty object with cJSON_CreateObject.
cJSON_CreateObject を使用して空のオブジェクトを作成できます。
cJSON_CreateObjectReference can be used to create an object that doesn't "own" its content, so its content doesn't get deleted by cJSON_Delete.
cJSON_CreateObjectReference を使用すると、コンテンツを「所有」しないオブジェクトを作成できるため、そのコンテンツは cJSON_Delete によって削除されません。

To add items to an object, use cJSON_AddItemToObject.
オブジェクトに項目を追加するには、cJSON_AddItemToObject を使用します。
Use cJSON_AddItemToObjectCS to add an item to an object with a name that is a constant or reference (key of the item, string in the cJSON struct), so that it doesn't get freed by cJSON_Delete.
cJSON_AddItemToObjectCS を使用して、定数または参照 (項目のキー、cJSON 構造体の文字列) の名前を持つオブジェクトに項目を追加します。これにより、項目が cJSON_Delete によって解放されなくなります。
Using cJSON_AddItemReferenceToArray an element can be added as a reference to another object, array or string.
cJSON_AddItemReferenceToArray を使用すると、要素を別のオブジェクト、配列、または文字列への参照として追加できます。
This means that cJSON_Delete will not delete that items child or valuestring properties, so no double frees are occurring if they are already used elsewhere.
これは、cJSON_Delete がその項目の子プロパティまたは valuestring プロパティを削除しないことを意味するため、それらがすでに他の場所で使用されている場合でも二重解放は発生しません。

If you want to take an item out of an object, use cJSON_DetachItemFromObjectCaseSensitive, it will return the detached item, so be sure to assign it to a pointer, otherwise you will have a memory leak.
オブジェクトから項目を取り出したい場合は、cJSON_DetachItemFromObjectCaseSensitive を使用します。これにより、切り離された項目が返されるため、必ずポインターに割り当ててください。そうしないと、メモリ リークが発生します。

Deleting items is done with cJSON_DeleteItemFromObjectCaseSensitive.
項目の削除は cJSON_DeleteItemFromObjectCaseSensitive で行われます。
It works like cJSON_DetachItemFromObjectCaseSensitive followed by cJSON_Delete.
これは、cJSON_DetachItemFromObjectCaseSensitive の後に cJSON_Delete が続くように機能します。

You can also replace an item in an object in place.
オブジェクト内のアイテムをその場で置き換えることもできます。
Either with cJSON_ReplaceItemInObjectCaseSensitive using a key or with cJSON_ReplaceItemViaPointer given a pointer to an element.
キーを使用する cJSON_ReplaceItemInObjectCaseSensitive を使用するか、要素へのポインターを指定した cJSON_ReplaceItemViaPointer を使用します。
cJSON_ReplaceItemViaPointer will return 0 if it fails.
cJSON_ReplaceItemViaPointer は失敗すると 0 を返します。
What this does internally is to detach the old item, delete it and insert the new item in its place.
これが内部的に行うことは、古い項目をデタッチして削除し、その場所に新しい項目を挿入することです。

To get the size of an object, you can use cJSON_GetArraySize, this works because internally objects are stored as arrays.
オブジェクトのサイズを取得するには、cJSON_GetArraySize を使用できます。これは、オブジェクトが内部的に配列として格納されるため機能します。

If you want to access an item in an object, use cJSON_GetObjectItemCaseSensitive.
オブジェクト内の項目にアクセスする場合は、cJSON_GetObjectItemCaseSensitive を使用します。

To iterate over an object, you can use the cJSON_ArrayForEach macro the same way as for arrays.
オブジェクトを反復するには、配列の場合と同じ方法で cJSON_ArrayForEach マクロを使用できます。

cJSON also provides convenient helper functions for quickly creating a new item and adding it to an object, like cJSON_AddNullToObject.
cJSON は、cJSON_AddNullToObject など、新しい項目をすばやく作成してオブジェクトに追加するための便利なヘルパー関数も提供します。
They return a pointer to the new item or NULL if they failed.
新しい項目へのポインタを返すか、失敗した場合は NULL を返します。

Parsing JSON

Given some JSON in a zero terminated string, you can parse it with cJSON_Parse.
ゼロで終了する文字列内の JSON を指定すると、cJSON_Parse を使用して解析できます。

cJSON *json = cJSON_Parse(string);

Given some JSON in a string (whether zero terminated or not), you can parse it with cJSON_ParseWithLength.
文字列内に JSON が含まれている場合 (ゼロ終了かどうかに関係なく)、cJSON_ParseWithLength を使用してそれを解析できます。

cJSON *json = cJSON_ParseWithLength(string, buffer_length);

It will parse the JSON and allocate a tree of cJSON items that represents it.
JSON を解析し、それを表す cJSON 項目のツリーを割り当てます。
Once it returns, you are fully responsible for deallocating it after use with cJSON_Delete.
それが返されたら、cJSON_Delete で使用した後に割り当てを解除するのは完全にユーザーの責任です。

The allocator used by cJSON_Parse is malloc and free by default but can be changed (globally) with cJSON_InitHooks.
cJSON_Parse で使用されるアロケーターは malloc で、デフォルトでは無料ですが、cJSON_InitHooks を使用して (グローバルに) 変更できます。

If an error occurs a pointer to the position of the error in the input string can be accessed using cJSON_GetErrorPtr.
エラーが発生した場合は、cJSON_GetErrorPtr を使用して、入力文字列内のエラーの位置へのポインターにアクセスできます。
Note though that this can produce race conditions in multithreading scenarios, in that case it is better to use cJSON_ParseWithOpts with return_parse_end.
ただし、これによりマルチスレッド シナリオで競合状態が発生する可能性があることに注意してください。その場合は、return_parse_end を指定して cJSON_ParseWithOpts を使用することをお勧めします。
By default, characters in the input string that follow the parsed JSON will not be considered as an error.
デフォルトでは、解析された JSON に続く入力文字列内の文字はエラーとみなされません。

If you want more options, use cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated).
さらにオプションが必要な場合は、cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) を使用します。
return_parse_end returns a pointer to the end of the JSON in the input string or the position that an error occurs at (thereby replacing cJSON_GetErrorPtr in a thread safe way).
return_parse_end は、入力文字列内の JSON の末尾、またはエラーが発生した位置へのポインターを返します (これにより、スレッド セーフな方法で cJSON_GetErrorPtr が置き換えられます)。
require_null_terminated, if set to 1 will make it an error if the input string contains data after the JSON.
require_null_terminated を 1 に設定すると、入力文字列に JSON の後にデータが含まれている場合にエラーになります。

If you want more options giving buffer length, use cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated).
バッファ長を指定するオプションをさらに追加したい場合は、cJSON_ParseWithLengthOpts(const char *value, size_tbuffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) を使用します。

Printing JSON

Given a tree of cJSON items, you can print them as a string using cJSON_Print.
cJSON 項目のツリーを指定すると、cJSON_Print を使用してそれらを文字列として印刷できます。

char *string = cJSON_Print(json);

It will allocate a string and print a JSON representation of the tree into it.
文字列を割り当て、ツリーの JSON 表現をその中に出力します。
Once it returns, you are fully responsible for deallocating it after use with your allocator.
返された後は、アロケーターで使用した後に割り当てを解除するのは完全にユーザーの責任です。
(usually free, depends on what has been set with cJSON_InitHooks).
(通常は無料ですが、cJSON_InitHooks での設定によって異なります)。

cJSON_Print will print with whitespace for formatting.
cJSON_Print は、書式設定のために空白を入れて印刷します。
If you want to print without formatting, use cJSON_PrintUnformatted.
書式設定せずに印刷する場合は、cJSON_PrintUnformatted を使用します。

If you have a rough idea of how big your resulting string will be, you can use cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt).
結果の文字列の大きさがどのくらいになるかおおよそのアイデアがわかっている場合は、cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) を使用できます。
fmt is a boolean to turn formatting with whitespace on and off.
fmt は、空白を含む書式設定をオンまたはオフにするブール値です。
prebuffer specifies the first buffer size to use for printing.
prebuffer は、印刷に使用する最初のバッファ サイズを指定します。
cJSON_Print currently uses 256 bytes for its first buffer size.
cJSON_Print は現在、最初のバッファー サイズとして 256 バイトを使用しています。
Once printing runs out of space, a new buffer is allocated and the old gets copied over before printing is continued.
印刷のスペースがなくなると、新しいバッファが割り当てられ、古いバッファがコピーされてから印刷が続行されます。

These dynamic buffer allocations can be completely avoided by using cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format).
これらの動的なバッファ割り当ては、cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) を使用することで完全に回避できます。
It takes a buffer to a pointer to print to and its length.
印刷先のポインターへのバッファーとその長さを受け取ります。
If the length is reached, printing will fail and it returns 0.
この長さに達すると印刷は失敗し、0 が返されます。
In case of success, 1 is returned.
成功した場合は 1 が返されます。
Note that you should provide 5 bytes more than is actually needed, because cJSON is not 100% accurate in estimating if the provided memory is enough.
cJSON は、提供されたメモリが十分であるかどうかの推定が 100% 正確ではないため、実際に必要な量より 5 バイト多く提供する必要があることに注意してください。

Example

In this example we want to build and parse the following JSON:
この例では、次の JSON を構築して解析します。

{
    "name": "Awesome 4K",
    "resolutions": [
        {
            "width": 1280,
            "height": 720
        },
        {
            "width": 1920,
            "height": 1080
        },
        {
            "width": 3840,
            "height": 2160
        }
    ]
}

Printing

Let's build the above JSON and print it to a string:
上記の JSON を構築して文字列に出力してみましょう。

//create a monitor with a list of supported resolutions
//NOTE: Returns a heap allocated string, you are required to free it after use.
char *create_monitor(void)
{
    const unsigned int resolution_numbers[3][2] = {
        {1280, 720},
        {1920, 1080},
        {3840, 2160}
    };
    char *string = NULL;
    cJSON *name = NULL;
    cJSON *resolutions = NULL;
    cJSON *resolution = NULL;
    cJSON *width = NULL;
    cJSON *height = NULL;
    size_t index = 0;

    cJSON *monitor = cJSON_CreateObject();
    if (monitor == NULL)
    {
        goto end;
    }

    name = cJSON_CreateString("Awesome 4K");
    if (name == NULL)
    {
        goto end;
    }
    /* after creation was successful, immediately add it to the monitor,
     * thereby transferring ownership of the pointer to it */
    cJSON_AddItemToObject(monitor, "name", name);

    resolutions = cJSON_CreateArray();
    if (resolutions == NULL)
    {
        goto end;
    }
    cJSON_AddItemToObject(monitor, "resolutions", resolutions);

    for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
    {
        resolution = cJSON_CreateObject();
        if (resolution == NULL)
        {
            goto end;
        }
        cJSON_AddItemToArray(resolutions, resolution);

        width = cJSON_CreateNumber(resolution_numbers[index][0]);
        if (width == NULL)
        {
            goto end;
        }
        cJSON_AddItemToObject(resolution, "width", width);

        height = cJSON_CreateNumber(resolution_numbers[index][1]);
        if (height == NULL)
        {
            goto end;
        }
        cJSON_AddItemToObject(resolution, "height", height);
    }

    string = cJSON_Print(monitor);
    if (string == NULL)
    {
        fprintf(stderr, "Failed to print monitor.\n");
    }

end:
    cJSON_Delete(monitor);
    return string;
}

Alternatively we can use the cJSON_Add...ToObject helper functions to make our lives a little easier:
あるいは、cJSON_Add...ToObject ヘルパー関数を使用して、作業を少し楽にすることもできます。

//NOTE: Returns a heap allocated string, you are required to free it after use.
char *create_monitor_with_helpers(void)
{
    const unsigned int resolution_numbers[3][2] = {
        {1280, 720},
        {1920, 1080},
        {3840, 2160}
    };
    char *string = NULL;
    cJSON *resolutions = NULL;
    size_t index = 0;

    cJSON *monitor = cJSON_CreateObject();

    if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
    {
        goto end;
    }

    resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
    if (resolutions == NULL)
    {
        goto end;
    }

    for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
    {
        cJSON *resolution = cJSON_CreateObject();

        if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][0]) == NULL)
        {
            goto end;
        }

        if (cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][1]) == NULL)
        {
            goto end;
        }

        cJSON_AddItemToArray(resolutions, resolution);
    }

    string = cJSON_Print(monitor);
    if (string == NULL)
    {
        fprintf(stderr, "Failed to print monitor.\n");
    }

end:
    cJSON_Delete(monitor);
    return string;
}

Parsing

In this example we will parse a JSON in the above format and check if the monitor supports a Full HD resolution while printing some diagnostic output:
この例では、上記の形式の JSON を解析し、いくつかの診断出力を出力する際に​​モニターがフル HD 解像度をサポートしているかどうかを確認します。

/* return 1 if the monitor supports full hd, 0 otherwise */
int supports_full_hd(const char * const monitor)
{
    const cJSON *resolution = NULL;
    const cJSON *resolutions = NULL;
    const cJSON *name = NULL;
    int status = 0;
    cJSON *monitor_json = cJSON_Parse(monitor);
    if (monitor_json == NULL)
    {
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
            fprintf(stderr, "Error before: %s\n", error_ptr);
        }
        status = 0;
        goto end;
    }

    name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
    if (cJSON_IsString(name) && (name->valuestring != NULL))
    {
        printf("Checking monitor \"%s\"\n", name->valuestring);
    }

    resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
    cJSON_ArrayForEach(resolution, resolutions)
    {
        cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
        cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height");

        if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
        {
            status = 0;
            goto end;
        }

        if ((width->valuedouble == 1920) && (height->valuedouble == 1080))
        {
            status = 1;
            goto end;
        }
    }

end:
    cJSON_Delete(monitor_json);
    return status;
}

Note that there are no NULL checks except for the result of cJSON_Parse because cJSON_GetObjectItemCaseSensitive checks for NULL inputs already, so a NULL value is just propagated and cJSON_IsNumber and cJSON_IsString return 0 if the input is NULL.
cJSON_GetObjectItemCaseSensitive は既に NULL 入力をチェックしているため、cJSON_Parse の結果を除いて NULL チェックは行われないことに注意してください。そのため、入力が NULL の場合、NULL 値が伝播されるだけで、cJSON_IsNumber と cJSON_IsString は 0 を返します。

Caveats

Zero Character

cJSON doesn't support strings that contain the zero character '\0' or \u0000.
cJSON は、ゼロ文字「0」または u0000 を含む文字列をサポートしていません。
This is impossible with the current API because strings are zero terminated.
文字列はゼロで終了するため、現在の API ではこれは不可能です。

Character Encoding

cJSON only supports UTF-8 encoded input.
cJSON は UTF-8 エンコードされた入力のみをサポートします。
In most cases it doesn't reject invalid UTF-8 as input though, it just propagates it through as is.
ただし、ほとんどの場合、無効な UTF-8 を入力として拒否せず、そのまま伝播します。
As long as the input doesn't contain invalid UTF-8, the output will always be valid UTF-8.
入力に無効な UTF-8 が含まれていない限り、出力は常に有効な UTF-8 になります。

C Standard

cJSON is written in ANSI C (or C89, C90).
cJSON は ANSI C (または C89、C90) で書かれています。
If your compiler or C library doesn't follow this standard, correct behavior is not guaranteed.
コンパイラまたは C ライブラリがこの標準に従っていない場合、正しい動作は保証されません。

NOTE: ANSI C is not C++ therefore it shouldn't be compiled with a C++ compiler.
注: ANSI C は C++ ではないため、C++ コンパイラでコンパイルしないでください。
You can compile it with a C compiler and link it with your C++ code however.
ただし、C コンパイラでコンパイルし、C++ コードとリンクすることはできます。
Although compiling with a C++ compiler might work, correct behavior is not guaranteed.
C++ コンパイラでのコンパイルは機能する可能性がありますが、正しい動作は保証されません。

Floating Point Numbers

cJSON does not officially support any double implementations other than IEEE754 double precision floating point numbers.
cJSON は、IEEE754 倍精度浮動小数点数以外の double 実装を正式にサポートしていません。
It might still work with other implementations but bugs with these will be considered invalid.
他の実装でも動作する可能性がありますが、これらのバグは無効とみなされます。

The maximum length of a floating point literal that cJSON supports is currently 63 characters.
現在、cJSON がサポートする浮動小数点リテラルの最大長は 63 文字です。

Deep Nesting Of Arrays And Objects

cJSON doesn't support arrays and objects that are nested too deeply because this would result in a stack overflow.
cJSON は、スタック オーバーフローが発生する可能性があるため、ネストが深すぎる配列とオブジェクトをサポートしていません。
To prevent this cJSON limits the depth to CJSON_NESTING_LIMIT which is 1000 by default but can be changed at compile time.
これを防ぐために、cJSON は深さを CJSON_NESTING_LIMIT に制限します。これはデフォルトでは 1000 ですが、コンパイル時に変更できます。

Thread Safety

In general cJSON is not thread safe.
一般に、cJSON はスレッドセーフではありません。

However it is thread safe under the following conditions:
ただし、次の条件下ではスレッドセーフです。

  • cJSON_GetErrorPtr is never used (the return_parse_end parameter of cJSON_ParseWithOpts can be used instead)
    cJSON_GetErrorPtr は決して使用されません (代わりに cJSON_ParseWithOpts の return_parse_end パラメーターを使用できます)
  • cJSON_InitHooks is only ever called before using cJSON in any threads.
    cJSON_InitHooks は、スレッドで cJSON を使用する前にのみ呼び出されます。
  • setlocale is never called before all calls to cJSON functions have returned.
    setlocale は、cJSON 関数へのすべての呼び出しが返されるまで呼び出されることはありません。

Case Sensitivity

When cJSON was originally created, it didn't follow the JSON standard and didn't make a distinction between uppercase and lowercase letters.
cJSON が最初に作成されたときは、JSON 標準に従っておらず、大文字と小文字が区別されていませんでした。
If you want the correct, standard compliant, behavior, you need to use the CaseSensitive functions where available.
標準に準拠した正しい動作が必要な場合は、利用可能な場合は CaseSensitive 関数を使用する必要があります。

Duplicate Object Members

cJSON supports parsing and printing JSON that contains objects that have multiple members with the same name.
cJSON は、同じ名前の複数のメンバーを持つオブジェクトを含む JSON の解析と出力をサポートします。
cJSON_GetObjectItemCaseSensitive however will always only return the first one.
ただし、cJSON_GetObjectItemCaseSensitive は常に最初のもののみを返します。

Enjoy cJSON!

  • Dave Gamble (original author)
  • Max Bruckner and Alan Wang (current maintainer)
  • and the other cJSON contributors