解析打字稿中的JSON数组

时间:2018-08-06 08:08:36

标签: javascript arrays json typescript parsing

我想解析打字稿中的数组。

我的代码如下:

interface MyObj {
  val1: string
  val2: string
  val3: string
}

const fs = require('fs')
const file = 'test.json'
const encode = 'utf8'
const jsonString = '[{val1 : "test1", val2 : "test2", val3 : "test3"}, { val1 : "test4", val2 : "test5", val3 : "test3"}]'
fs.writeFile(file, JSON.stringify(jsonString))
fs.readFile(file, encode, (err, data) => {
  const objs = JSON.parse(data) as MyObj[]
  console.log(data)
  console.log(objs)

  for (const obj of objs) {
    console.log(obj)
    console.log(obj.val1)
    console.log(obj.val2)
    console.log(obj.val3)
  }

})

然后结果如下:

"[{val1 : \"test1\", val2 : \"test2\", val3 : \"test3\"}, { val1 : \"test4\", val2 : \"test5\", val3 : \"test6\"}]"
[{val1 : "test1", val2 : "test2", val3 : "test3"}, { val1 : "test4", val2 : "test5", val3 : "test6"}]
[
undefined
undefined
undefined
{
undefined
undefined
undefined
v
undefined
undefined
undefined
a
undefined
undefined
undefined
l
undefined
undefined
undefined
1
undefined
undefined
undefined
.
.
.

似乎parse是成功的,但在解析后可能语法有些错误,但找不到它们。

我的环境是:

  • MacOS 10.12.6

  • NPM 5.6.0

  • TypeScript 2.9.1

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您的代码有几个问题。

首先,您使用json语法要求引用属性做"val1": "test1"而不是val1: "test1"

第二,您应该使用import fs = require('fs')语法进行导入。

第三,也是最重要的是,您将json作为字符串写入文件。 jsonString已经是一个字符串,无需在其上再次使用stringify。如果这样做,解析的结果将是字符串而不是对象数组。

interface MyObj {
    val1: string
    val2: string
    val3: string
}

import fs = require('fs')
const file = 'test.json'
const encode = 'utf8'
const jsonString = '[{"val1" : "test1", "val2" : "test2", "val3" : "test3"}, { "val1" : "test4", "val2" : "test5", "val3" : "test3"}]'
fs.writeFileSync(file, jsonString);
fs.readFile(file, encode, (err, data) => {
    const objs = JSON.parse(data) as MyObj[]
    console.log(data)
    console.log(objs)

    for (const obj of objs) {
        console.log(obj)
        console.log(obj.val1)
        console.log(obj.val2)
        console.log(obj.val3)
    }

})

答案 1 :(得分:0)

问题是对象中的键周围没有双引号(“)。因此JSON无效,浏览器无法成功解析。

所以不是

path = path.replace("${file.path}", realValue);
//or even
path = path.replace(variable, realValue);

您应该拥有

{
  val1: "test1",
  val2: "test2",
  val3: "test3"
}

您始终可以在jsonlint.com之类的网站上检查自己是否具有有效的JSON。

答案 2 :(得分:0)

您的代码有几个问题。

  1. '[{val1 : "test1", val2 : "test2", val3 : "test3"}, { val1 : "test4", val2 : "test5", val3 : "test3"}]'是无效的JSON。属性名称周围应该有双引号。
  2. 在将字符串写入文件之前先对其进行字符串化。读完后再解析。这两个操作可以有效地相互抵消,您将获得一个(格式不太正确的)JSON字符串。

您应该做的是将属性名称用双引号引起来并删除JSON.stringify。 Althoug不能完全确定为什么将它写到文件中只是为了读回去吗?

const jsonString = '[{"val1" : "test1", "val2" : "test2", "val3" : "test3"}, { "val1" : "test4", "val2" : "test5", "val3" : "test3"}]';
fs.writeFile(file, jsonString);
fs.readFile(file, encode, ...