[[JSON]]っぽいけど[[JSON]]ではない[[JSON Lines]]のようなフォーマットをパースしたい場合。
```ts
function parseJsonLike(str: string): object | object[] {
let jsonStrs = str
.replaceAll(/[ \n]/g, "")
.replaceAll(/},/g, "}")
.replaceAll(/}/g, "},");
const isRootArray = jsonStrs.trim()[0] === "[";
if (!isRootArray) {
jsonStrs = `[${jsonStrs}]`;
}
jsonStrs = jsonStrs.replaceAll(/,}/g, "}").replaceAll(/,]/g, "]");
const json = JSON.parse(jsonStrs);
if (json.length === 1 && !isRootArray) {
return json[0]
}
return json;
}
```
対応パターン。
```ts
const 普通のJSON = `{"id": 1, "name": "one"}`
const 長さ1のJSON = `[{"id": 1, "name": "one"}]`
const ArrayのJSON = `
[
{
"id": 1,
"name": "one"
}
{
"id": 2,
"name": "two"
}
]
`
console.log("--- 完全 ---")
console.log(parseJsonLike(普通のJSON))
console.log(parseJsonLike(長さ1のJSON))
console.log(parseJsonLike(ArrayのJSON))
const 不完全なArrayのJSON_1行ずつ = `
{"id": 1, "name": "one"}
{"id": 2, "name": "two"}
`
const 不完全なArrayのJSON_フォーマットで複数行ずつ = `
{
"id": 1,
"name": "one",
}
{
"id": 2,
"name": "two",
}
`
const 不完全なネストしたJSON = `
{
"id": 1,
"name": {
"ja": "いち",
"en": "one",
},
}
{
"id": 2,
"name": {
"ja": "に",
"en": "two",
"others": ["つー", "✌️"],
},
}
`
console.log("--- 不完全 ---")
console.log(parseJsonLike(不完全なArrayのJSON_1行ずつ))
console.log(parseJsonLike(不完全なArrayのJSON_フォーマットで複数行ずつ))
console.log(parseJsonLike(不完全なネストしたJSON))
```
<button class="playground"><a href="https://www.typescriptlang.org/play?target=9#code/GYVwdgxgLglg9mABABwIYCcDOBTAUphAGRgGtsAKTKdALkSvRjAHMBKOuAIwCttpEAPoi69oAbQC6iAN4AoRIgA22KIm4EwAZWqZEAXnrV5CxADp02ZItQRsAQUWLyAejGIAOmAnPmAGkQARAGsxgrmlta2Dk7OAL6+Pv4BscGhZhZWNvaOLrGJgfHBANyyxhAIVIgwmABKcHBQdujoqACe+moa2lim1DAAtuSsYgAMUnoTgWIBJQowwIjkAITVdQ1NLa2sMmnqCN26BgAGYgAk0ntaOrESR7OIsaUKlwcdLzrhmVE5zr55fgVgp9ItkYr5vACAhJimUKqpLh1cJoAPIAOVMaCwFHeWFY93mi0upmULCgAAt9JMAIyIABktMQK1q9UazTa2zkJkQFigIHQSEuowkxkeCh5fIFGhKj1k5TAlUAdmaALATAHYMSLRHSO0gCMAAJgE6FSkmBUP1sAbAghzbEjrK4YhAO6pgFUGKlqlGozVibV6i1GwIms0WgJW5K3O3y1QbNpujXHWRiYyckw6-WG3xpAIB810YNgc0ixMZn10ABM6a5mdN2cCUAA7nAAgXhbbwwRlMS4MxyAEALR9xCAGO1ABaKiD7PdScrb2A7XcxOHwRFIFGVMdRrBCk7g7cUnfIc7wGmIZHIztd6rXG4qW+nO9nGHnh6X5CjrVX69Kk9UgFg5YeAKwYX6uAD6VKADIRgBaDIAJgyarI3qpogfqVoGOYho8sEWmW-pVkGdYNo8tqfogP5Dv+bKvuegGAKsMgCVDIAPwyAHsMgDDDIAEwyAOYMgDgkYADqbgVBcZJimvrlphSGWnmATpqhxj8aWgmIdWAQ4WJsh4a235-oAswyAJ0MTGAOoMgD6DOe0F8cW8EyVmFpJgoATcKgQaACIMgCGDIpFbYGAQYhoJ8RKTBknGWWklmXQFmBNZQaANYMTnJi52H1hFlkNGS2BYBa0wQTRYmBIAMOSAPB-UIeeJsgtpu267r2-ZEaOfYTlexV3liC5gEeFBESRmxAaBkHvkVN67vu9WNeQzUAeR1H0cx7FcR1l7yteM57veB6LsezWaTp+nuuuQA">Playground</a></button>