代码之家  ›  专栏  ›  技术社区  ›  vijayakumarpsg587

nodejs-将字符串解析为json对象

  •  0
  • vijayakumarpsg587  · 技术社区  · 7 年前

    我在nodejs中尝试使用fs.read file和fs.read获取一个示例json文件。 这是我正在读取的json测试文件

    {
        "HttpTestResponse":
            [
              { 
                 "title":"testTitle2",
                 "id": 2,
                 "name":"testName3",
                 "testArray":[{"testProp1":"testPropVal2","testProp2":"testPropVal_2"}]
              },
              {
                "title":"testTitle3",
                "id": 3,
                "name":"testName3",
                "testArray":[{"testProp1":"testPropVal3","testProp2":"testPropVal_3"}]
              }
            ]
    
    
    }
    

    这是示例函数(我使用typescript和nodejs进行更严格的输入)

    getJSONFromFile(paramId) {
        let obj: HttpTestModel[];
        fs.exists(this.resolvedUrl, exists => {
          if (exists) {
            fs.readFile(this.resolvedUrl, 'utf-8', (err, data) => {
              if (err) {
                this.pino.info('error while reading the file', err);
              } else {
                this.pino.info('data', JSON.parse(data));
                // tslint:disable-next-line:one-variable-per-declaration
                // tslint:disable-next-line:prefer-const
                // tslint:disable-next-line:one-variable-per-declaration
                obj = JSON.parse(data);
                this.pino.info('plain data', data);
                this.pino.info('data in parseJSON', parseJson(data));
              }
            });
          }
        });
      }
    

    这是我得到的输出。我正在使用pino模块,因此输出有一些默认级别和时间戳

    {"level":30,"time":1550563397320,"msg":"plain data {\r\n    \"HttpTestResponse\":\r\n        [\r\n
    { \r\n             \"title\":\"testTitle2\",\r\n             \"id\": 2,\r\n             \"name\":\"testName3\",\r\n             \"testArray\":[{\"testProp1\":\"testPropVal2\",\"testProp2\":\"testPropVal_2\"}]\r\n
          },\r\n          {\r\n            \"title\":\"testTitle3\",\r\n            \"id\": 3,\r\n            \"name\":\"testName3\",\r\n            \"testArray\":[{\"testProp1\":\"testPropVal3\",\"testProp2\":\"testPropVal_3\"}]\r\n          }\r\n        ]\r\n        \r\n    \r\n}","pid":21212,"hostname":"INDV072294","v":1}
    
    
    {"level":30,"time":1550563397321,"msg":"stringifed data {\r\n    \"HttpTestResponse\":\r\n        [\r\n
         { \r\n             \"title\":\"testTitle2\",\r\n             \"id\": 2,\r\n             \"name\":\"testName3\",\r\n             \"testArray\":[{\"testProp1\":\"testPropVal2\",\"testProp2\":\"testPropVal_2\"}]\r\n          },\r\n          {\r\n            \"title\":\"testTitle3\",\r\n            \"id\": 3,\r\n
       \"name\":\"testName3\",\r\n            \"testArray\":[{\"testProp1\":\"testPropVal3\",\"testProp2\":\"testPropVal_3\"}]\r\n          }\r\n        ]\r\n        \r\n    \r\n}","pid":21212,"hostname":"INDV072294","v":1}
    
    
    {"level":30,"time":1550563397322,"msg":"data in parseJSON {\"HttpTestResponse\":[{\"title\":\"testTitle2\",\"id\":2,\"name\":\"testName3\",\"testArray\":[{\"testProp1\":\"testPropVal2\",\"testProp2\":\"testPropVal_2\"}]},{\"title\":\"testTitle3\",\"id\":3,\"name\":\"testName3\",\"testArray\":[{\"testProp1\":\"testPropVal3\",\"testProp2\":\"testPropVal_3\"}]}]}","pid":21212,"hostname":"INDV072294","v":1}
    

    我还尝试使用parse json模块,但是没有任何东西可以帮助我输出我想要的结果。我希望json对象作为输出,而不是字符串,这样我就可以存储它并迭代它并过滤出所需的结果

    有人能帮我解决这个问题吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   孙欣乐    7 年前

    你可以使用 pino-pretty 哪一个是pino的插件或模块。

    npm i -S pino pino-pretty

    示例代码如下:

    const pino = require('pino')
    const logger = pino({
        prettyPrint: {
            levelFirst: true,
        },
    })
    const filePath = '' // 
    
    fs.exists(filePath, exists => {
        if (exists) {
            fs.readFile(filePath, 'utf-8', (err, data) => {
                if (err) {
                } else {
                    const obj = JSON.parse(data);
                    logger.info('data', JSON.parse(data));
                    logger.info(JSON.parse(data));
                    logger.info(data);
                }
            });
        }
    });
    

    记录器输出

    INFO  [1550565533231] (19285 on aa-pc): data {"HttpTestResponse":[{"title":"testTitle2","id":2,"name":"testName3","testArray":[{"testProp1":"testPropVal2","testProp2":"testPropVal_2"}]},{"title":"testTitle3","id":3,"name":"testName3","testArray":[{"testProp1":"testPropVal3","testProp2":"testPropVal_3"}]}]}
    
    
    INFO  [1550565533233] (19285 on aa-pc):
        HttpTestResponse: [
          {
            "title": "testTitle2",
            "id": 2,
            "name": "testName3",
            "testArray": [
              {
                "testProp1": "testPropVal2",
                "testProp2": "testPropVal_2"
              }
            ]
          },
          {
            "title": "testTitle3",
            "id": 3,
            "name": "testName3",
            "testArray": [
              {
                "testProp1": "testPropVal3",
                "testProp2": "testPropVal_3"
              }
            ]
          }
        ]
    
    INFO  [1550565533234] (19285 on aa-pc): {
    "HttpTestResponse":
    [
    {
    "title":"testTitle2",
    "id": 2,
    "name":"testName3",
    "testArray":[{"testProp1":"testPropVal2","testProp2":"testPropVal_2"}]
    },
    {
    "title":"testTitle3",
    "id": 3,
    "name":"testName3",
    "testArray":[{"testProp1":"testPropVal3","testProp2":"testPropVal_3"}]
    }
    ]
    
    }
    
    
    

    你可以自己试试。哈哈哈

        2
  •  0
  •   vijayakumarpsg587    7 年前

    上面的答案非常适合使用js的用户。如果你打算使用TS,那么一个小小的修改和最佳实践是。

    首先安装类型(pino的类类型定义)。

    npm安装-s@types/pino

    然后按照上面的步骤安装好pino

    现在创建一个名为logger.ts的单独文件,并像这样导出pino的prertyprint配置

    import * as pino from 'pino';
    
    export const logger = pino({
      name: 'prj-sample',
      prettyPrint: {
        levelFirst: true,
      },
    });
    

    现在您可以像这样在代码中的任何地方导入logger const并使用它

    import { logger } from './../../../shared/utils/logger';
    .....
    .....
    .....
    getJSONFromFile(paramId) {
        let obj;
        fs.exists(this.resolvedUrl, exists => {
          if (exists) {
            fs.readFile(this.resolvedUrl, 'utf-8', (err, data) => {
              if (err) {
                logger.info('error while reading the file', err);
              } else {
                obj = JSON.parse(data);
                logger.info('data data :', obj.HttpTestResponse);
                logger.info('data is', JSON.parse(data));
                logger.info(JSON.parse(data));
                logger.info(data);
              }
            });
          }
        });
      }