2016-11-14 287 views
0

我正在生成一系列嵌套对象(在元素的'failReasons'和'照片'下)的对象数组 - 然后我想将结果数组作为JSON到一个Web API,它将期望一个对象列表,以及嵌套的对象列表。第一部分工作 - 数组接收对象列表并可以解析它们,但是,在将数组转换为JSON时,嵌套数组为空。使用嵌套对象数组的JSON.Stringify数组TypeScript/JS

这是我产生了数组: Array 这里是个什么样子,当我字符串化是这样的:

{"capeNo":"ABCD1234","insDate":"2016-11-10 15:03:18","inspector":"User.Name","inspectionResult":"Pass","comments":"","site":"Site Name","dismCompleteDate":"","failReasons":[],"photos":[]} 

正如你所看到的,failReasons,它有它的数组中的6个对象被字符串化之前,现在只是一个空阵列。

我用下面的代码来生成数组:

接口:

export interface inspectionUpload { 
     capeNo: string; 
     insDate: string; 
     inspector: string; 
     inspectionResult: string; 
     comments: string; 
     site: string; 
     dismCompleteDate; 
     failReasons: Array<Object>; 
     photos: Array<Object>; 
} 

export interface inspectionFailures { 
     failCategory: string; 
     failReason: string; 
     resolution: string; 
     inspectionId: string; 
} 

export interface inspectionPhotos { 
     base64: string; 
} 

而这种填充阵列:

this.sql.query('SELECT rowid,* FROM InspectionResults_tbl').then((res) => { 
    var arr = [] 

    for (var i = 0; i < res.res.rows.length; i++) { 
     var item = res.res.rows.item(i); 
     var header: inspectionUpload = { 
      capeNo: item.capeNo, 
      insDate: item.inspectionDT, 
      inspector: item.inspectedBy, 
      inspectionResult: item.result, 
      comments: item.comment, 
      site: this.SharedService.site, 
      dismCompleteDate: item.dismantleDate, 
      failReasons: <inspectionFailures[]> [], 
      photos: <inspectionPhotos[]> [] 
     } 

     if (item.result == 'Fail') { 
      console.log(item); 
      this.sql.query('SELECT * FROM InspectionFailures_tbl WHERE inspectionId = ?', [item.rowid]).then((res) => { 
       for (var i = 0; i < res.res.rows.length; i++) { 
        var item = res.res.rows.item(i); 
        header.failReasons.push({ 
         failCategory: item.failCategory, 
         failReason: item.failreason, 
         resolution: item.resolution, 
         FRId: item.FRId 
        }) 
       } 
      }) 
     } 

     this.sql.query('SELECT * FROM InspectionPhotos_tbl WHERE inspectionId = ?', [item.rowid]).then((res) => { 
      for (var i = 0; i < res.res.rows.length; i++) { 
       var item = res.res.rows.item(i); 
       header.photos.push({ 
        base64: item.base64 
       }) 
      } 
     }) 



     arr.push(header); 
     if ((i + 1) == res.res.rows.length) upload(arr) 
    } 
}) 

最后,以字符串化它:

function upload(a) { 
      console.log(a); 
      console.log(JSON.stringify(a)); 
     } 

帮助将不胜感激:)

+0

在外部查询的回调中执行的那些查询与该查询的异步性相同。这些查询完成后,数组将填充,但在外部回调完成后会发生这种情况。 – Pointy

+0

@Pointy,如果我遵循,你是说在我的失败原因和照片数组填充之前调用json.stringify?我曾经考虑过这个问题,但是在我将它串起来的同时,我调用了数组的console.log,并且当时可以看到数据(根据屏幕截图?)或者我误解了它们吗? – fl3rgle

+1

顶级对象'已经登录了,在你的图像的最上面的框架中,它旁边是否有一个小的蓝色'i'? –

回答

0

这可能是因为你在承诺解决之前打印字符串数组。

 this.sql.query('SELECT * FROM InspectionFailures_tbl WHERE inspectionId = ?', [item.rowid]).then((res) => { 
      for (var i = 0; i < res.res.rows.length; i++) { 
       var item = res.res.rows.item(i); 
       header.failReasons.push({ 
        failCategory: item.failCategory, 
        failReason: item.failreason, 
        resolution: item.resolution, 
        FRId: item.FRId 
       }) 
      } 
     }) 
    ... 

    arr.push(header); 
    if ((i + 1) == res.res.rows.length) upload(arr) 

,如果你做了下面的代码将正确字符串化(这是不是做了正确的方法,我只是证明你不能字符串化,直到然后完成推填充数组...):

 var queryComplete = false; 

     this.sql.query('SELECT * FROM InspectionFailures_tbl WHERE inspectionId = ?', [item.rowid]).then((res) => { 
      for (var i = 0; i < res.res.rows.length; i++) { 
       var item = res.res.rows.item(i); 
       header.failReasons.push({ 
        failCategory: item.failCategory, 
        failReason: item.failreason, 
        resolution: item.resolution, 
        FRId: item.FRId 
       }) 
      } 
      queryComplete = true; 
     }) 
    ... 

    while (!queryComplete){ 
     //noop 
    } 

    arr.push(header); 
    if ((i + 1) == res.res.rows.length) upload(arr)