在节点js中将JSON.gz转换为JSON

时间:2015-06-05 11:41:19

标签: javascript json node.js amazon-s3 gz

我正在节点模块中检索S3存储桶的对象。对象采用object.json.gz格式。我需要将其解压缩到object.json,以便能够在节点模块中解析它。以下是代码段

aws.config.update({ accessKeyId: <my_key>, secretAccessKey: <my_secret_key>, region: <my_region> });
var s3 = new aws.S3();
s3.getObject(
  { Bucket: "<my_bucket>", Key: "<my_file_key>"},
  function (error, data) {
    if (error != null) {
        console.log("Error retrieving the Object from the S3 bucket.")
        console.log(error);
    } else {
        zlib.gunzip(data, function(err, buffer){
              if (!err) {
                console.log(buffer);
              }
              else console.log(err);
            });
    }
  }
);

如果我将对象data记录到控制台,它会记录以下内容,

{ AcceptRanges: 'bytes',
LastModified: 'Thu, 04 Jun 2015 17:41:12 GMT',
ContentLength: '12677',
ETag: '"ebb8f339f569b9aea1038c005442eedd"',
ContentEncoding: 'gzip',
ContentType: 'application/json',
ServerSideEncryption: 'AES256',
Metadata: {},
Body: <Buffer 1f 8b 08 00 00 00 00 00 00 00 ed 7d fb 73 1a 47 d6 f6   bf a2 f2 4f ef 5b b5 c3 f6 fd 32 bf 39 de d8 eb dd 38 71 6c 25 ce e6 ab ad ad be da bc 91 84 02 92 ...> }

如果我记录buffer,则会记录以下内容,

[TypeError: Invalid non-string/buffer chunk]

如果我在data.body上运行zlib.gunzip,它会记录以下内容,

<Buffer >

我在互联网上尝试了许多变通办法,但没有奏效。作为node.js的新手,这真让我感到沮丧。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我找到了解压缩JSON.gz文件的解决方案。我使用了zlib模块。

 var zlib = require('zlib');

 zlib.gunzip(data,function(error, buff){
   if(error != null){                                       
      //An error occured while unzipping the .gz file.
   }
   else{                                                    
    //Use the buff which contains the unzipped JSON.
   }
 });
可以使用zlib安装

npm install zlib

答案 1 :(得分:3)

Paritosh Walvekar的回答对我有所帮助,但我想为其他有此问题的人添加更多实施细节。我的用例是尝试从S3读取ELB日志(不是json但是.gz文件)。

  • 不要担心ResponseContentType。您可以将其保留为默认值。
  • 要将buff变成一个字符串,你可以使用buff.toString('utf8')来验证某些东西是否正常工作。
  • 如果将lambda与节点运行时6.10一起使用(截至本文撰写时最新),则只需输入var zlib = require('zlib');在顶部

我的代码:

var AWS = require('aws-sdk');
var zlib = require('zlib');
var s3 = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = (event, context, callback) => {
    //Other code to keep lambda alive, other bus logic, etc...
    
    //Use s3 sdk to list objects
    //This code is inside a loop of list results
    (function(key){
        var params = {
            Bucket: bucket, /* required */
            Key: key /* required */
        };
        s3.getObject(params, function(err, data) {
            if (err) getLogEvents(null, err); // an error occurred
            else     getLogEvents(data);           // successful response
        });
    })(data.Contents[i].Key);
    
    function getLogEvents(data, err){
        if(err == undefined){
           zlib.gunzip(data.Body,function(error, buff){
           if(error != null){                                 
              console.log(error)
           }
           else{                                             
            console.log(buff.toString('utf8'))
           }
           context.done(null, null);
         });
        }else{
            console.log(err, err.stack);
        }
        
        //Do final bus logic before exiting
     }
};

我终于得到了纯文本输出(是的,我混淆了一些隐藏敏感信息的数字),我很放心:

  

2017-05-07T18:03:06.319Z 6a92874b-334f-11e7-b021-031f400273ab http 2017-05-07T17:47:12.249487Z app / app-elb / 165c3641668dfeh4 50.123.146.312:59275 - -1 -1 -1 503 - 435 788“获取http://app-elb-9898692007.us-east-1.elb.amazonaws.com:80/ HTTP / 1.1”“Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 58.0.3029.96 Safari / 537.36” - - arn:aws:elasticloadbalancing:us-east-1:676540590099:targetgroup / app-elb-targetgroup / 980f40fc23gc342e“Root = 1-590f5da0-37650b96857fe0943aa7900b”