有没有办法在Typescript中将字符串解析为JSON ? 示例:在JS中,我们可以使用JSON.parse()。Typescript中有类似的函数吗?

我有一个JSON对象字符串如下:

{"name": "Bob", "error": false}

当前回答

嘿,如果你对json对象进行typeof,结果是typescript类型的字符串。你可以在这里阅读更多:Typescript:字符串和字符串的区别

所以试试这个方法,它会起作用的

JSON.parse(String({"name": "Bob", "error": false}))

其他回答

嘿,如果你对json对象进行typeof,结果是typescript类型的字符串。你可以在这里阅读更多:Typescript:字符串和字符串的区别

所以试试这个方法,它会起作用的

JSON.parse(String({"name": "Bob", "error": false}))

有一个很棒的ts-json-object库

在你的情况下,你需要运行以下代码:

import {JSONObject, required} from 'ts-json-object'

class Response extends JSONObject {
    @required
    name: string;

    @required
    error: boolean;
}

let resp = new Response({"name": "Bob", "error": false});

这个库将在解析之前验证json

在我看来,对于包含在关联数组| Map<string中的数据,任何>,有点放松(只有键检查),但在我看来最简单的方法(JsDoc版本)

(使用空py类实例进行类型引用和每个键匹配,如果解析或键匹配失败则返回'undefined')

types.js

export class FormCheckError {
    constructor(
        /** @type {string?}*/ message, 
        /** @type {string?}*/ oldValue
    ) { 
        this.oldValue = oldValue;
        this.errorMessage = message;
    }
}

json.js

/**
 * @template T
 * @param   { Object<keyof T,any>[] } keys2Check 
 * @param   { string } jsonString
 * @returns { T | undefined }
 */
 export function JsonCheckedParse(keys2Check = [],jsonString = '{}') {
    try {
        let result = JSON.parse(jsonString)
        let resultKeys = Object.keys(result)
        if (keys2Check.length !== resultKeys.length) {
            return undefined;
        } 
        keys2Check.forEach(function(key) {
            if (resultKeys.indexOf(key) == -1) {
                return undefined;                
            }
        })
        return result;
    } catch(e) {
        return undefined;
    }
}

使用场景:

1.编码:

ssr-side.js

import { FormCheckError } from 'types'

...
if (oldValue.length == 0) {
    return {
      body:  JSON.stringify(
        new FormCheckError(
            "You shouldn't post empty entries.", 
            oldValue
        )
     )
    }
}
...

2.解码:

browser-side.js

import { FormCheckError } from 'types'  
import { JsonCheckedParse } from 'json'     
...

/** @type {import('./$types').ActionData} */  // Sveltekit stuff
export let form;  // response received from 'ssr-side.js'

// will be undefined in case of type mismatch beetween encoded & decoded
/** @type {FormCheckError | undefined}*/
let checkError = JsonCheckedParse(
    Object.keys(new FormCheckError()), // an empty class instance for knowing its keys
    form?.body || '{}' // the JSON to parse and check for type
) 

...
if (checkError?.errorMessage) {
    console.log(String(checkError.errorMessage))
}
...

你还可以使用一些库来执行json的类型验证,比如Sparkson。它们允许你定义一个TypeScript类,你想解析你的响应,在你的情况下,它可以是:

import { Field } from "sparkson";
class Response {
   constructor(
      @Field("name") public name: string,
      @Field("error") public error: boolean
   ) {}
}

该库将验证所需字段是否出现在JSON有效负载中,以及它们的类型是否正确。它还可以执行一系列验证和转换。

Typescript是javascript的超集,所以你只需要使用JSON。像在javascript中那样解析:

let obj = JSON.parse(jsonString);

只有在typescript中,你才能有结果对象的类型:

interface MyObj {
    myString: string;
    myNumber: number;
}

let obj: MyObj = JSON.parse('{ "myString": "string", "myNumber": 4 }');
console.log(obj.myString);
console.log(obj.myNumber);

(操场上的代码)