首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从json字符串转换为json对象后从Typescript中的对象数组中获取结果,我的编码有什么问题

如何从json字符串转换为json对象后从Typescript中的对象数组中获取结果,我的编码有什么问题
EN

Stack Overflow用户
提问于 2020-03-14 15:52:00
回答 2查看 57关注 0票数 1

请看我下面的代码。在从json字符串转换为json对象后,我正在从对象数组中提取数据。

代码语言:javascript
复制
export class FourColumnResults {

    constructor(private column1: string, private column2: string,
        private column3: string, private column4: string) {

    }

    public get $column1(): string {
        return this.column1;
    }

    public set $column1(value: string) {
        this.column1 = value;
    }


    /** all getter and setter methods */
}


export class ValidationSummary {

    constructor(private column1: string, private column2: string, private column3: string,
        private column4: string, private column5: string, private column6: string,
        private column7: string) {

    }

    public get $column1(): string {
        return this.column1;
    }

    public set $column1(value: string) {
        this.column1 = value;
    }

    /** all getter and setter methods */

}

从./FourColumnResult导入{ FourColumnResults };从‘./ ValidationSummary’导入{ValidationSummary};

代码语言:javascript
复制
export class MyConverter {

    public convert(jsonString: string): FourColumnResults[] {
        const results: FourColumnResults[] = [];
        const valSummary: ValidationSummary[] = JSON.parse(jsonString);
        console.log("ValSummary object======== ", valSummary); // This is printing correctly

        for(let i = 0; i < valSummary.length; i++) {
            const value: ValidationSummary = valSummary[i];
            console.log("=====>"+value.$column1);
        }

        return results;
    }

}

下面是我从系统中得到的实际json字符串。

代码语言:javascript
复制
[
  {
    "column1": "Data-1",
    "column2": "Data-2",
    "column3": "Data-3",
    "column4": "Data-4",
    "column5": "Data-5",
    "column6": "Data-6",
    "column7": "Data-7"
  },
  {
    "column1": "Data-11",
    "column2": "Data-12",
    "column3": "Data-13",
    "column4": "Data-14",
    "column5": "Data-15",
    "column6": "Data-16",
    "column7": "Data-17"
  },
  {
    "column1": "Data-31",
    "column2": "Data-32",
    "column3": "Data-33",
    "column4": "Data-34",
    "column5": "Data-35",
    "column6": "Data-36",
    "column7": "Data-37"
  }
]

这里的问题是,我可以用下面的代码将上面的json字符串解析成我的ValidationSummary.ts类型的json对象。

代码语言:javascript
复制
const valSummary: ValidationSummary[] = JSON.parse(jsonString);

但是,我无法从以下编码中获得结果。

代码语言:javascript
复制
for(let i = 0; i < valSummary.length; i++) {
            const value: ValidationSummary = valSummary[i];
            console.log("=====>"+value.$column1); // Prints Undefined
        }

我的代码出了什么问题?请帮我解决。

EN

回答 2

Stack Overflow用户

发布于 2020-03-14 15:56:55

应该是value.column1而不是value.$column1

代码语言:javascript
复制
for(let i = 0; i < valSummary.length; i++) {
    const value: ValidationSummary = valSummary[i];
    console.log("=====>"+value.column1); // Prints the value
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-14 16:21:36

问题

由于您是从字符串进行解析,因此它将不具有原始的Class属性。使用冒号指定

代码语言:javascript
复制
const value: ValidationSummary

将只提供数据的类型。

应答

您必须为JSON.parse函数提供一个reviver函数,如下所示。

数据应该有一个密钥来恢复数据,所以,维护一个密钥,

代码语言:javascript
复制
const s = '{"data":[{"column1":"Data-1","column2":"Data-2","column3":"Data-3","column4":"Data-4","column5":"Data-5","column6":"Data-6","column7":"Data-7"},{"column1":"Data-11","column2":"Data-12","column3":"Data-13","column4":"Data-14","column5":"Data-15","column6":"Data-16","column7":"Data-17"},{"column1":"Data-31","column2":"Data-32","column3":"Data-33","column4":"Data-34","column5":"Data-35","column6":"Data-36","column7":"Data-37"}]}';

您的类应该有一个从json数据创建对象的from函数。

代码语言:javascript
复制
class ValidationSummary {

    constructor(private column1: string, private column2: string, private column3: string,
        private column4: string, private column5: string, private column6: string,
        private column7: string) {

    }

    static from(json: ValidationSummary) {
        return Object.assign(new ValidationSummary(), json);
    }

    public get $column1(): string {
        return this.column1;
    }

    public set $column1(value: string) {
        this.column1 = value;
    }

    /** all getter and setter methods */

}

最后,reviver函数将类功能映射到数据。

代码语言:javascript
复制
function reviveData(key: string, value: any) {
    if (key === 'data') {
        return value.map(ValidationSummary.from);
    }
    return value;
}

传递数据和复活器函数

代码语言:javascript
复制
data = JSON.parse(s, reviveData).data;
console.log(data[0].$column1);

输出

代码语言:javascript
复制
"Data-1"

代码:http://www.typescriptlang.org/play/?ssl=31&ssc=1&pln=32&pc=1#

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60680804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档