サーチ…


備考

JSON(JavaScript Object Notation)は、もともとDouglas Crockfordによって指定された、最も広く普及しているデータ交換フォーマットの1つです。

現在、 RFC 71592ECMA-404という 2つの競合する標準によって記述されています。 ECMA標準は最小限であり、許可された文法構文のみを記述するが、RFCはまた、いくつかの意味論的およびセキュリティ上の考慮事項を提供する。

  • JSONは、クライアントとサーバーの間でデータを交換するためのクライアント/サーバーアーキテクチャを含むソフトウェアで広く受け入れられています。
  • JSONは使いやすく、テキストベースの軽量で人間が読める形式であり、人々はしばしばXMLの置き換えとして誤解しています。
  • 略語はJavaScriptで始まりますが、JSONは言語ではなく、言語リテラルを持つだけでデータの表記の仕様になります。
  • これはプラットフォームと言語に依存せず、組み込みのほとんどすべてのフロントライン言語/フレームワークでサポートされており、JSONデータフォーマットのサポートは、C#、PHP、Java、C ++、Python、Rubyなどなど。
  • JSONの公式インターネットメディアの種類はapplication / jsonです。
  • JSONファイル名の拡張子は.jsonです。

バージョン

JSONには更新がないので、JSONのバージョンは1つだけです。このリンクは、RFC 4627の元のRFCドキュメントにリダイレクトされます。

バージョン発売日
元の 2006-07-28

JSONの構文規則

JSON(JavaScript Object Notation)構文は、JavaScriptのサブセットに基づいています( json.org参照 )。

有効なJSON式は、次のデータ型のいずれかになります。

  • 単純なデータ型:String、Number、Boolean、Null
  • 複合データ型:値、オブジェクト、配列

シンプルなデータ型

JSON文字列は二重引用符で囲む必要があり、0個以上のUnicode文字を含むことがあります。バックスラッシュエスケープが許可されます。受け入れられたJSON番号はE表記です。 Booleanはtruefalseいずれかです。 Nullは予約済みのnullです。

データ・タイプ有効なJSONの例
###文字列 "apple"
"苹果"
"\u00c4pfel\n"
""
###番号 3
1.4
-1.5e3
###ブール true
false
### ヌル null

複合データ型

JSON値は、String、Number、Boolean、Null、Object、Arrayのいずれかです。

オブジェクト

JSONオブジェクトは、name:Stringのコンマで区切られた順序付けられていない値のペアであり、nameはStringであり、値はJSON値です。

アレイ

JSON配列は、JSON値の順序付けられたコレクションです。

JSON配列の例:

["home", "wooden"]

JSONオブジェクトの例:

{
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
}

[
  1,
  2,
  [3, 4, 5, 6],
  {
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
  }
]

JSONデータの検証と書式設定のためのオンラインツール:

JSONオブジェクト

JSONオブジェクトは中括弧で囲まれ、キーと値のペアが含まれています。

{ "key1": "value1", "key2": "value2", ... }

キーは有効な文字列でなければならず、したがって二重引用符で囲まれています。値は、JSONオブジェクト、数値、文字列、配列、または次の 'リテラル名'のいずれか( falsenull 、またはtrueです。キーと値のペアでは、キーはコロンで区切られています。複数のキーと値のペアはカンマで区切ります。

オブジェクトの順序は重要ではありません。したがって、次のJSONオブジェクトは上記と同じです。

{ "key2": "value2", "key1": "value1", ... }

すべてをまとめると、これは有効なJSONオブジェクトの例です:

{
  "image": {
    "width":  800,
    "height": 600,
    "title":  "View from 15th Floor",
    "thumbnail": {
      "url": "http://www.example.com/image/481989943",
      "height": 125,
      "width":  100
    },
    "visible": true,
    "ids": [116, 943, 234, 38793]
  }
}

JSONオブジェクトの一般的な例、関連する(Java)オブジェクトの対応

この例では、JSONにシリアライズされている 'root'オブジェクトが次のクラスのインスタンスであると想定されています。

public class MyJson {
}

例1: MyJsonインスタンスの例です。

{}

つまり、クラスにはフィールドがないため、中括弧のみがシリアル化されます。 中括弧はオブジェクトを表す一般的な区切り文字です。また、ルートオブジェクトがキーと値のペアとしてどのようにシリアライズされていないかに注目してください。これは、単純な型(文字列、数値、配列)が(外側の)オブジェクトのフィールドでない場合にも当てはまります。

例2:いくつかのフィールドをMyJson追加して、いくつかの値でそれらを初期化しましょう:

// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {} 

// an enriched version of our test class
public class MyJson {
  String myString = "my string";
  int myInt = 5;
  double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
  MyOtherJson objectInObject = new MyOtherJson();    
}

これは関連するJSON表現です:

{
  "myString" : "my string",
  "myInt" : 5,
  "myArrayOfDoubles" : [ 3.14, 2.72 ],
  "objectInObject" : {}
}

すべてのフィールドがキー値構造体でどのようにシリアライズされているかに注目してください。キーは値を保持するフィールドの名前です。配列の一般的な区切り文字は大括弧で囲まれています。最後のペアを除いて、各キーと値のペアの後にコンマが続くことにも注意してください。

JSON配列

JSON配列は、順序付けられた値の集合です。それは角かっこ[] ie []で囲まれ、値はコンマで区切られます。

{ "colors" : [ "red", "green", "blue" ] }

JSON配列には、以下の2つのオブジェクトを持つ配列のこの例のように、オブジェクトを含む任意の有効なJSON要素を含めることもできます(RFCドキュメントから取得)。

[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]

混合型の要素を含むこともできます。たとえば、次のようになります。

[
    "red",
    51,
    true,
    null,
    {
        "state": "complete"
    }
]

JSON配列(およびオブジェクト)を記述する際のよくある間違いは、最後の要素の後にカンマをつけることです。これは多くの言語で一般的なパターンですが、残念ながらJSONでは無効です。たとえば、次の配列は無効です。

[
    1,
    2,
]

これを有効にするには、最後の要素の後のカンマを削除してから、次のように変更する必要があります。

[
    1,
    2
]

手でJSONを編集する

JSONは非常に厳密な形式です( http://json.orgを参照 。これにより、機械の解析や書き出しが容易になりますが、目立たない間違いで文書が破損した場合には、人間を驚かせることになります。

一般的な問題

末尾のカンマ

ほとんどのプログラミング言語とは異なり、末尾にカンマを追加することはできません。

{
  a: 1,
  b: 2,
  c: 3
}

3後にカンマを追加すると、synaxエラーが発生します。

配列にも同じ問題があります:

[ 
  1,
  2
]

アイテムの順序を変更する必要がある場合は、特別な注意が必要です。

カンマがない

{
  a: 1,
  b: 2,
  c: 3
  d: 4
}

末尾のカンマは許可されていないので、新しい値を追加する前に追加することを忘れてしまいます(この場合は3 )。

コメント

JSONは、データ交換フォーマットであるためコメントを許可しません。これはまだ話題ですが、使用しない以外の明確な答えはありません。

いくつかの回避策があります。

  • Cスタイルのコメントを使用し、パーサーに渡す前にそれらを取り除く
  • データにコメントを埋め込む
{
  "//": "comment",
  "data": 1
}
  • コメントを埋め込んでデータで上書きする
{
  "data": "comment",
  "data": 1
}

2番目のdataエントリは、ほとんどのパーサーでコメントを上書きします。

ソリューション

JSONを簡単に記述できるようにするには、構文エラーをチェックし、構文の色付けを行うIDEを使用します。プラグインは、ほとんどのエディタで利用できます。

アプリケーションやツールを開発するときは、JSONを内部的にプロトコルとして使用しますが、人間が手で編集する必要がある場所(デバッグを除く)に公開しないようにしてください。

このような用途に適した他のフォーマットを評価する:

  • Hjsonは 、JSONとの間でシームレスに変換できます
  • TOML 、INIファイルと同様
  • YAML 、より多くの機能が追加された複雑さを犠牲にして

アレイ対オブジェクトの根拠(何をいつ使用するか)

JSON配列はオブジェクトのコレクションを表します。 JSでは、 slicepoppushなど、それらのコレクション関数の束があります。オブジェクトには生データだけがあります。

JSONArray順序付けられた 値のシーケンスです 。その外部テキスト形式は角カッコで囲まれた文字列で、値を区切るコンマで区切られています。

JSONObjectは、 名前と値のペアの順序付けられていないコレクションです。その外部形式は、中括弧で囲まれた文字列で、名前と値の間にコロンがあり、値と名前の間にカンマがあります。

Object - キーと値、配列 - 数字、文字列、ブール値これはいつ使うのですか?

配列は "is a / an"、Objectは "have a"と考えることができます。例として "Fruit"を使用します。フルーツアレイのすべてのアイテムはフルーツの一種です。

array fruit : [orange, mango, banana]

配列にはオブジェクト、文字列、数値、配列を含めることができますが、オブジェクトや配列だけを扱うことができます。

array fruit : [orange:[], mango:{}, banana:{}]

。オレンジも配列であることがわかります。オレンジ色になるアイテムは、オレンジ色のものです。つまり、bitter_orange、mandarin、sweet_orangeです。

フルーツオブジェクトの場合、その中のアイテムはフルーツの属性です。したがって果物は

object fruit :{seed:{}, endocarp:{},flesh:{}}

これはまた、種オブジェクトの中の何かが種のプロパティでなければならないことを意味します。たとえば、color、..

JSONは主にJavaScriptオブジェクトを文字列にシリアライズするための言語です。したがって、JSON文字列をデシリアライズするときには、javascriptオブジェクト構造を取得する必要があります。 jsonがobject1に100個のobjectを格納するオブジェクトにdeserializeすると、それは非常に不便になります。ほとんどのデシリアライザは、既知のオブジェクトと既知のオブジェクトの配列を持つことを期待しているため、使用している言語の文字列を実際のオブジェクト構造に変換できます。また、これはオブジェクト指向設計の哲学があなたに答えるという質問です。

すべての参加者にクレジットJSON配列とJSONオブジェクトの違いは何ですか?



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow