1

JSON は、複雑なデータ構造をプレーン テキストで表現する優れた方法のようです。この複雑なデータ構造を OOP オブジェクト (クラスのインスタンス) に類似していると考えると、クラス自体 (データ部分のみ - メソッドは忘れてください) を表す一般的に使用される JSON のような形式はありますか? JSON自体をこれに使用できますか?

別の言い方をすれば、JSON が名前と値のペアをエンコードする場合、名前だけをエンコードしたい場合は何を使用すればよいでしょうか?

これが必要な理由は、jQuery で使用するプロトコルを設計しているためです (ちなみに、私は完全な初心者です)。クライアントは、返してほしい JSON オブジェクトの構造をサーバーに伝え、サーバーはその構造の JSON オブジェクトに値を追加して返します。

重要な点は、サーバーが返すデータ フィールド (名前と値のペア) を完全に制御できるのはクライアントであるということです。これは、クライアントが要求を行い (通常、非常に限られたパラメーターのセットが含まれている場合)、サーバーがどのフィールドを決定するかという、Web 上でこれまでに見つけたすべての jQuery の例とは少し異なります。 JSON 応答で返されます。

(明らかに、クライアントが要求するものはサーバーのデータ モデルと一致している必要があります。サーバーに独自の価格を持つウィジェットの配列がある場合、クライアントはそれぞれ独自のウィジェットを持つ価格の配列を要求することはできません。)

これは一般的な問題であるに違いありません。車輪の再発明はしたくありません。すでに Web 全体で一般的に使用されているソリューションを採用したいと考えています。

編集JSON Schema が見つかりました。これは私が探しているものではありません。必要以上のものが含まれています。

編集 私は、「あなたが試すことができる…」という答えではなく、「これが通常行われる方法です」という答えをもっと探しています。(私は何十もの可能な答えを自分で考え出すことができます。)

4

4 に答える 4

1

私はもっ​​と探しています'これは通常それが行われる方法です'答え

あなたが望むことをするための単一の「正しい」方法はありません。多くの人が実装しています。それはさまざまな要因に依存します-あなたが何をしたいのか、どこでしたいのか、どれだけ効率的にそれをしたいのか?


単純な構造の場合、私は@dbr9979によって与えられた答えを好みそして提案します。

ネストされた構造の場合、ネストされた配列を持つことができます。何かのようなもの:

{
    "nestedfield1": {
        "nestedfield11":["nestedfield111", "nestedfield112"],
        "nestedfield12":["nestedfield121", "nestedfield122"],
        "__SIMPLE_FIELDS__": ["simplefield13", "simplefield14"]
    }
}

重要なのは、キーがの場合__SIMPLE_FIELDS__、値は単純なフィールド(文字列、数値など)の配列であり、そうでない場合、キーはオブジェクト内のキーを表します。


もっと複雑なことについては、サーバーとクライアントの両方が知っている事前定義された構造があることをお勧めします。これは、複数の同一の要求を行う必要がある場合に特に役立ちます。それぞれに一意の番号を割り当てます。何かのようなもの:

1 => <the structure above>
2 => ["simplefield1", "simplefield2" ..]
3 => etc .. etc

サーバーは、上記の構造と関連する番号をデータベースなどに保存します。そして今、今では明らかかもしれませんが、クライアントは必要な構造のIDを送信し、サーバーは適切な方法で応答します。

于 2012-07-06T09:03:57.253 に答える
1

JSON 内の名前のみをエンコードするには、キーがクラス名または「値」という名前のキーのいずれかであるキーと値のペアを使用できます。値は、サーバーによって返される名前である文字列の配列です。 . 例えば:

{ 'class_name' : [ "name1", "name2", "name3" ] }

サーバーは、使用されたキーからクラス名を検出し、クラスがサポートしている場合は配列内の名前に指定された値を返すか、サポートしていない場合は無視することができます。

于 2012-07-05T14:35:46.653 に答える
1

私はあなたがこれで何を意味したと思います:

サーバーが返すデータ フィールド (名前と値のペア) を完全に制御するクライアント。

SQLにおけるSELECT * FROM Bagsとの違いのようなものです。SELECT color, price FROM Bag私はあなたを正しく解釈していますか?

次の方法でクエリを実行できます。

{
    'resource': 'Bag',
    'field_names': ['color', 'price']
}

応答が返されます。

{
    'status': 'success',
    'result': [
        {'color': 'red', 'price': 50},
        {'color': 'blue', 'price': 45},
    ]
}

ただし、ほとんどの場合、リクエストが JSON オブジェクトである必要は実際にはありません。http://foo.com/bag?fields=color,priceのように、フィールド名がクエリ文字列から取得される実装を見てきました。

于 2012-07-06T10:02:31.890 に答える
0

Partial Responseを探していました。

RESTful API 設計: あなたの API は、開発者が必要とする情報だけを提供できますか? すべてを説明し、LinkedIn、Facebook、および Google の例を示します。Google と Facebook はどちらも同様のアプローチをとっています。Google のアプローチを使用すると、Lie Ryan の例は次のようになります。

url?fields=status,result(color,price)

Google と Facebook がこれを後押ししているので、これがデファクト スタンダードになっても不思議ではありません。

私の場合、URL の長さ制限に遭遇する可能性が高いため、代わりに POST を使用する必要がありますが、これは私にとって優れた出発点です。

于 2012-07-06T13:06:38.123 に答える