将typescript对象转换为有效的JSON

时间:2017-05-14 02:10:35

标签: json angular

EDIT3: 这是我的结果 enter image description here

这是我从后端获得结果的代码:

private extractTrains(res: Response){
      let body = res.json();
      let trains = body['List of vehicles'];
      return trains;
  }

我如何得到每个结果元素(所以像train [5] ['Latitude']一样有效)而不是每个结果元素(比如train [5] [7]返回一个char,而不是我想要的?)< / p>

另一个编辑: enter image description here 正如https://stackoverflow.com/a/43959884/1144431所建议的,我现在有常规字符串作为数组的每个元素,在字符串中有双引号。现在我必须将这些双引号转换为JSON的单引号,对吧?

1 个答案:

答案 0 :(得分:0)

扩展Pengyy的答案,通常当我做这样的事情时,我实现了一个MyClass.fromJson(res)方法,该方法将主体解析为一个MyClass对象,该对象很容易在模板和Api服务中使用。

想想这样的事情

export class Train {
    TripID:number;
    Direction:number;
    time:number;
    etc...

    static fromJson(json: any): Train {
        return Object.assign(this.placeholder(), json)
    }

    public static placeholder(): Train {
        let p = new Train();
        p.TripID = -1;
        p.Direction = -1;
        p.time = -1;
        etc...
        return p;
    }
}

然后你会将Array<Train>传递给* ngFor并使用点符号。

所以在你的情况下你可以这样做(假设res包含一个[array]的火车jsons)

private extractTrains(res: Response): Array<Train> {
  return res.json().map(json => Train.fromJson(json));
}

您的评论澄清了这只是一个解析错误,因此您可以重新格式化JSON以正确解析。

var weirdlyFormattedJson = '"{\'hello\':\'world\'}"'
var fixed = weirdlyFormattedJson.split('')
    .filter(x => {return x!='"'})
    .map(x => {return (x=="'") ? '"' : x}).join("");
var parsedJson = JSON.parse(fixed);

请注意,如果某个地方的json属性中实际存在",则会失败。你最好的选择可能是删除每个项目中的第一个和最后一个字符,如果是这样你可以这样做

var fixedJson = badJson.slice(1, -1).split('')
    .map(x => {return (x=="'") ? '"' : x}).join("");

请注意,如果属性中有',这也会失败。 您可能实际上必须创建一个转换器来跟踪:的位置,并且只替换包装每个键和值的'

这里有一个小的演示,尽管你必须使用递归来实现真正的实现 https://jsfiddle.net/b60Ladbr/ 原因是任何嵌套对象{}都无法正确解析,因此如果您遇到{作为每个:分隔数组的第二个数组项的第一个字符,那么''我必须将所有内容从{提取到}并将其传回fixJson