[[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>