JSON とは
JSON (JavaScript Object Notation、JS Object Notation) は、軽量のデータ交換形式です。これは、ECMAScript (European Computer Manufacturers Association、European Computer Association によって開発された js 仕様) のサブセットに基づいており、プログラミング言語から完全に独立したテキスト形式を使用してデータを格納および表現します。シンプルで明確な階層により、JSON は理想的なデータ交換言語になります。人間が読み書きするのは簡単で、機械が解析して生成するのも簡単で、ネットワーク伝送の効率を効果的に向上させることができます。
JSON は JavaScript から派生したもので、軽量 (Light-Meight)、テキストベース (Text-Based)、および人間が判読できる (Human-Readable) 形式です。
現在の開発では、データ交換に使用できる JSON XML 形式が 2 つあります。
JSON は、テキスト情報を格納および交換するための構文です. XML と同様に、JSON は XML よりも小さく、高速で、解析が容易です。
というわけで、JSONの説明を簡単にまとめると以下のようになります。
- JSON は、どのプログラミング言語にも依存しないデータ形式です
- データを保存および転送するための軽量な形式です
- 文法は自己記述的であり、人間が読みやすく理解しやすい
JSON 構文
基本的な構文:
- 配列は角括弧「[]」で表されます
- オブジェクト (0bject) は中かっこ "{}" で表されます
- 配列とオブジェクトに結合された名前と値のペア (名前と値)
- 名前 ( name ) は二重引用符で囲まれ、値 (value) には文字列、数値、ブール値、null、オブジェクト、および配列が含まれます
- 並列データはコンマ「,」で区切ります
- 名前と値のペアは、フィールド名 (二重引用符で囲んだもの)、コロン、値で構成されます。
注意する必要があるのは次のとおりです。
JSON はコメントをサポートしていません。JSON にコメントを追加しても効果がない
JSONファイルのファイルタイプは
.json
JSON テキストの タイプは
MIME
次のとおりです。application/json
JSON データを取得する
JSON はオブジェクトの形式で存在し、次のメソッドを使用して JSON データを直接取得できます。
1.jsonオブジェクト.キー名
2. json オブジェクト [「キー名」]
3. 配列オブジェクト [インデックス]
4.トラバース
コード例:
//定义基本格式
var person = { name: "张三", age: 23, gender: true };
var persons = [
{ name: "张三", age: 23, gender: true },
{ name: "李四", age: 24, gender: true },
{ name: "王五", age: 25, gender: false },
];
//获取person对象中所有的键和值
//for in 循环
/* for(var key in person){
//这样的方式获取不行。因为相当于 person."name"
//alert(key + ":" + person.key);
alert(key+":"+person[key]);
}*/
//获取persons中的所有值
for (var i = 0; i < persons.length; i++) {
var p = persons[i];
for (var key in p) {
console.log(key + ":" + p[key]);
}
}
出力は次のとおりです。
JSON の解析とシリアル化 (JavaScript)
図に示すように、最初に JSON オブジェクトをコンソールに出力して、そこにあるものを確認します。
明らかに、JSON オブジェクトには JavaScript の 2 つのメソッドしかありません: parse と stringify です。この 2 つの方法については、後で詳しく説明します。
シリアライゼーションの概念:シリアライゼーションは、オブジェクトを一連のバイトに変換するプロセスです。オブジェクトがシリアル化されると、ネットワーク上で送信したり、ハード ディスクに保存したりできます。
オブジェクトを json 文字列にシリアル化します: JSON.stringify(json object);
逆シリアル化: JSON 文字列をオブジェクトに逆シリアル化します: JSON.parse(str)
JSON.パース
API の紹介: JSON 文字列を解析し、文字列で記述された値またはオブジェクトを構築するために使用され JavaScript
、受信文字列が JSON 仕様に準拠していない場合はエラーが報告されます
文法:
JSON.parse(str, reviver);
str
: 解析する JSON 文字列reviver
: オプション関数function(key,value)
、関数の第 1 パラメーターと第 2 パラメーターは、それぞれキーと値のペアのキーと値を表し、値を変換できます (関数の戻り値は処理された値と見なされます)。
コード例:
// JSON.parse() 解析JSON字符串, 将JSON转换为对象
let json = '{"name": ["js", "webpack"], "age": 22, "gridFriend": "ljj"}';
console.log(JSON.parse(json));
// {name: Array(2), age: 22, gridFriend: 'ljj'}
// 第二个参数是一个函数,key和value代表每个key/value对
let result = JSON.parse(json, (key, value) => {
if (key == "age") {
return `年龄:${value}`;
}
return value;
});
console.log(result);
//{name: Array(2), age: '年龄:22', gridFriend: 'ljj'}
JSON.stringify
API の紹介: JavaScript
オブジェクトまたは値を JSON 文字列に変換する
関数が指定されている場合は replacer
、必要に応じて値を置き換えます。 replacer
配列が指定されている場合は、必要に応じて配列で指定されたプロパティのみを含めます
文法:
JSON.stringify(value, replacer, space)
value: JSON 文字列にシリアライズされる値
リプレイスメント:
- パラメーターが関数の場合、シリアル化された値の各属性は、シリアル化プロセス中に関数によって変換および処理されます。
- パラメータが配列の場合、配列に含まれるプロパティ名のみが最終的な JSON 文字列にシリアル化されます
- このパラメーターが null または指定されていない場合、オブジェクトのすべてのプロパティがシリアル化されます
space:出力を美しくするために使用されるインデント用の空白文字列を指定します
- 引数が数値の場合は、スペースの数を表し、上限は 10 です。値が 1 未満の場合、スペースがないことを意味します
- パラメータが文字列の場合 (文字列の長さが 10 文字を超える場合は、最初の 10 文字を取る)、文字列はスペースとして扱われます。
- このパラメーターが指定されていない (または null である) 場合、スペースはありません。
コード例:
let obj = {
name: "jsx",
age: 22,
lesson: ["html", "css", "js"],
};
let json = JSON.stringify(obj);
console.log(json);
// {"name":"jsx","age":22,"lesson":["html","css","js"]}
// 第二个参数replacer 为函数时,被序列化的值得属性都会经过该函数转换处理
function replacer(key, value) {
if (typeof value === "string") {
return undefined;
}
return value;
}
let result = JSON.stringify(obj, replacer);
console.log(result);
// {"age":22,"lesson":[null,null,null]}
// 当replacer参数为数组,数组的值代表将被序列化成 JSON 字符串的属性名
let result1 = JSON.stringify(obj, ["name", "lesson"]);
// 只保留 “name” 和 “lesson” 属性值
console.log(result1);
// {"name":"jsx","lesson":["html","css","js"]}
// 第三个参数spcae,用来控制结果字符串里面的间距
let result2 = JSON.stringify(obj, null, 4);
console.log(result2);
/*{
"name": "jsx",
"age": 22,
"lesson": [
"html",
"css",
"js"
]
}*/
注:リプレースが関数である場合、関数は深い処理を実行します。つまり、キーと値のペアの値も配列である場合、関数も実行されます。
JSON.stringify() の原則
toJSON()
Convert Valueメソッドがある場合 、このメソッドはシリアル化される値を定義します- 非配列オブジェクトのプロパティは、シリアル化された文字列で特定の順序で表示されるとは限りません
- ブール値、数値、および文字列ラッパー オブジェクトは、シリアル化中に対応するプリミティブ値に自動的に変換され、未定義、任意の関数、およびシンボル値はシリアル化中に無視されます (非-array オブジェクト) または null に変換されます (配列に存在する場合)。functions と undefined を別々に変換すると、 JSON.stringify(function(){}) や JSON.stringify(undefined) のように undefined が返されます。
- 循環参照 (オブジェクトが互いに参照し、無限ループを形成する) を含むオブジェクトに対してこのメソッドを実行すると、エラーがスローされます。
- プロパティ キーとして記号を含むすべてのプロパティは、replacer パラメータに含める必要がある場合でも、完全に無視されます。
- Date は toJSON() を呼び出して文字列文字列 (Date.toISOString() と同じ) に変換するため、文字列として扱われます。
- NaN および Infinity 形式の値と null は null として扱われます
- Map/Set/WeakMap/WeakSet などの他のタイプのオブジェクトは、列挙可能なプロパティのみをシリアル化します