简体   繁体   English

解析完整的json文件打字稿

[英]Parse complete json file typescript

I want to view and edit a JSON file in typescript/Angular 2. But i can't read childs 我想在Typescript / Angular 2中查看和编辑JSON文件。但是我看不懂childs

My JSON looks like this : 我的JSON看起来像这样:

{
    "site": {
        "listing":{
            "nbpage":10,
            "lengthcorps":320
        },
        "detail":{
            "sim":{
                "active":true,
                "nb":10
            }
        },
        "tri":{
            "default": {
                "type":"item",
                "sens":"item"
            },
            "options": ["options1","options2"]
        },
        "cc": {
            "nb": 0,
            "active":1
        },
        "hasreferencement":false
    }
}

I have my interfaces 我有我的界面

export interface site {
    model: string;
    listing:listing;
    detail:detail;
    contact:contact;
    tri:tri;
    cc:cc;
    hasselection?:boolean;
    hasreferencement?:boolean;
}

export interface listing {
    nbpage?:number;
    type?:number;
    lengthcorps?:number;
}
export interface detail {
    type?:number;
    sim?:sim;
    lengthcoprs?:number;
    gallery?:boolean;
}
export interface tri {
    default?:defaulttri;
    options?:string[];
}

export interface cc {
    nb?:number;
    active?:number;
}
export interface sim{
    active?:boolean;
    nb?:number;
}

export interface defaulttri{
    type?:string;
    sens?:string;
}

All is working well, but now i want print/modify all attributes on my template And it's here my little problem 一切工作正常,但是现在我想打印/修改模板上的所有属性,这是我的小问题

        <ul *ngFor="let item of uploadFile.site | JsonPipe3; let i=index">
          <li>{{ item.key }} => {{item.value }}</li>   
        </ul>

export class JsonPipe3 implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    let keys2 =[];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
      /*
      if(this.isAnyObject(value[key])){
        for (let key2 in value[key]) {
          keys2.push({key: key2, value:value[key2]});
        }
      }
      */

    }
    //return [keys,keys2];
    return keys;
  }
  isAnyObject(value) {
    return value != null && (typeof value === 'object' || typeof value === 'function');
  } 
}

I can read only the first child of an attribute like ""hasreferencement":false" else i have [Object Object] On my pipe i tried a test if object exist on the second child but it's not working correctly and if I have a third child i can only read the second with this idea 我只能读取属性的第一个子级,例如““ hasreferencement”:false“,否则我有[Object Object]在我的管道上,我尝试测试第二个子级是否存在对象,但它不能正常工作,如果我有第三个子级孩子,我只能用这个想法读第二篇

I hope someone can help me ^^ Thanks 我希望有人可以帮助我^^谢谢

You're getting [Object Object] because angular calls toString() on each value you bind to the view, and toString() of an object is JS returns [Object Object] (if not overridden). 之所以得到[Object Object]是因为对绑定到视图的每个值进行toString()角调用,而对象的toString()是JS,则返回[Object Object] (如果未重写)。

Your commented if is almost correct, try this one 您的评论是否几乎正确,请尝试此

transform(value, args:string[]) : any {
    let keys = [];
    let keys2 =[];
    for (let key in value) {
      if(this.isAnyObject(value[key])){
        for (let key2 in value[key]) {
          keys2.push({key: key2, value:value[key][key2]});// <-- instead of value:value[key2]
        }
      } else {
          keys.push({key: key, value: value[key]});
      }
    }
    return keys.concat(keys2); // <-- instead of [keys, keys2]
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM