web-dev-qa-db-ja.com

JSONドキュメントをCでデコードする理想的な方法は?

データ送信方法としてJSONを使用する消費するAPIがあるとすると、各APIリソースによって返されるJSONをデコードする理想的な方法は何ですか?たとえば、Javaでは、APIリソースごとにクラスを作成してから、そのクラスのオブジェクトを開始し、そこからデータを消費します。

例えば:

_class UserJson extends JsonParser
{
    public function UserJson(String document) {
    /*Initial document parsing goes here...*/
    }
//A bunch of getter methods . . . .
}
_

おそらくこのようなことをします:

_UserJson userJson = new UserJson(jsonString);//Initial parsing goes in the constructor
String username = userJson.getName();//Parse JSON name property then return it as a String.  
_

または、連想配列(つまり、ハッシュテーブル)でプログラミング言語を使用する場合、デコードプロセスでクラスを作成する必要はありません。

(PHP)

_$userJson = json_decode($jsonString);//Decode JSON as key=>value  
$username = $userJson['name'];
_

しかし、手続き型プログラミング言語(C)でプログラミングしている場合、CはOOPでも、デフォルトで少なくとも連想配列もサポートしていない)ので、どちらの方法でも行けません。

定義済みのJSON文字列を解析する「正しい」方法は何ですか(例:APIプロバイダーがサンプルまたはドキュメントを介して指定したJSONドキュメント)。

私が現在使用しているメソッドは、解析する各APIリソースのファイルを作成しています。このメソッドの問題は、OOPメソッドの基本的にお粗末なバージョンであることです。 OOPメソッドですが、何も提供していませんOOP利点(たとえば、パーサーのオブジェクトを渡すことができないなど)。

私は各APIリソースパーサーファイルをパブリックアクセス構造(すべての関数/パブリックに使用可能な変数を構造にポイントする)にカプセル化し、ストラクチャ(parser.parse()parser.getName()など)。この方法は私の現在の方法よりも少し良く見えますが、それでもまだOOPの方法から離れているだけですよね?

手続き型プログラミング言語でJSONドキュメントを解析するメソッドの提案はありますか?私が現在を使用しているメソッドについてのコメントはありますか(そのうちの3つ)?

3
Abdulaziz

Cは静的に型付けされ、JSONはそうではなく、JSON要素はnull、数値、文字列、ブール、オブジェクト、または配列になる可能性があるため、基本的には「OOP way "。JSON値を表すレコードタイプを作成し、それがどのタイプのJSON値であるかを示すタグであるメンバーを持っている。次に、このレコードタイプに基づいて構築される「サブクラス」を作成する。 JSONをCでうまく表現するには、基本的にOOPとポリモーフィズムを再作成する必要があります。

JSON値を使用するものはすべて、基本レコードタイプへのポインタを取得する必要があります。オブジェクトはalways参照型であり、C++言語の設計の選択が不十分であることを忘れないでください。それ以外の場合は多態性が台無しになり、これを行うには多態性が必要です。実際に使用している「サブクラス」の種類がわかったら、(タグメンバーをチェックすることにより)JSON値ポインターを適切なサブクラスタイプポインターにキャストして、残りのレコードにアクセスできます。

4
Mason Wheeler

あなたはそれを正しく行っています。これは古い問題です-JSONのさまざまな型と順序付けされていないプレゼンテーションの側面は、すべてのデータマークアップによって提示されるものと基本的に同じです少なくともSGMLに戻る言語。

特にCの場合、すでに利用可能なオプションがたくさんあります。グーグル "C JSON Parser"jsmn を含む多くの結果が得られます。これは、Java XMLの処理の多くのレッスンを学習したようですより直接的に、これは StackOverflowagain および again で対処されています。そしてもちろん、Crockfordの JSON.org は、JSONの16の異なるC実装をリストします。

1
Ross Patterson

同じ問題がありました。私はc構造を修正しており、jsonオブジェクト/配列へのインポート/エクスポートを望んでいました。結果のライブラリはここにあります: https://github.com/jamie-pate/jstruct および https://github.com/json-c/json-c を使用します実際のjson解析/文字列化。

これは、c構造体のヘッダーに注釈を追加し、ヘッダーを解析してメタデータを生成することで機能し、jsonをc構造体と1行でインポート/エクスポートできるようにします。

//@json
struct my_my_json_data {
    /*
    @schema {
        "title": "ID",
        "description": "unique object id",
        "type": "int"
    }
    */
    uint64_t id;

    /* don't include in json */
    //@private
    int _id;

    bool active;
}
0
Jamie Pate