JSON とは
JavaScript Object Notation の略らしい。
Object などを JSON 文字列に変換する
JSON といえば Object 型に近い見た目しているので、 Object しか変換できないかと思ったけど、けっこう何でも変換できる。
変換するもの自体はそれほど関係なく、あくまで JSON 文字列というものに変換するといった挙動かも。
const obj = {
hello: 'object world',
}
const arr = [ 'hello', 'array', 'world' ]
const str = 'hello, string world {}'
console.log(JSON.stringify(arr))// {"hello":"object world"}
console.log(JSON.stringify(obj))// ["hello","array","world"]
console.log(JSON.stringify(str))// "hello, string world {}"
変換できない例
例外として下記がエラーでるらしい。
- 値が循環参照を含む場合
- BigInt の場合
// 循環参照
try {
let obj2 = {}
obj2.obj = obj2
console.log(obj2)// <ref *1> { obj: [Circular *1] }
console.log(JSON.stringify(obj2))// エラー
} catch (e) {
// Converting circular structure to JSON
// --> starting at object with constructor 'Object'
// --- property 'obj' closes the circle
console.log(e.message)
}
// BigInt
try {
const int = BigInt(1)
console.log(int)// 1n
console.log(JSON.stringify(int))// エラー
} catch (e) {
// Do not know how to serialize a BigInt
console.log(e.message)
}
JSON 文字列を解析(parse)して値として扱う
const obj = {
hello: 'object world',
}
const arr = [ 'hello', 'array', 'world' ]
const str = 'hello, string world {}'
let parsedObj = JSON.parse(JSON.stringify(obj))
let parsedArr = JSON.parse(JSON.stringify(arr))
let parsedStr = JSON.parse(JSON.stringify(str))
console.log(parsedObj.hello)// object world
console.log(parsedArr[0])// hello
console.log(parsedStr)// hello, string world {}
String 型(文字列)でも解析できれば値として扱える
let parsedObj2 = JSON.parse('{"hello":"object world"}')
console.log(parsedObj2.hello)// object world
例外エラー
解析できない JSON 文字列はエラーになる。
try {
console.log(JSON.parse('hello warld {}'))// エラー
} catch (e) {
// Unexpected token I in JSON at position 0
console.log(e.message)
}
// こっちはエラーにならない
let s = JSON.parse(JSON.stringify('hello warld {}'))
console.log(s)// hello, string world {}
try ~ catch
体感けっこう例外エラーでやすい箇所なので、
javascript で JSON を扱う時は try ~ catch した方が安全だと思う。
let obj = {
hello: 'object world',
}
let j = null
try {
j = JSON.stringify(obj)
} catch (e) {
console.log(e.message)
}