javascript にて JSON 文字列に変換、JSON を解析(parse)して値として扱う

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)
}