Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON对象转换为特定类型_Javascript_Json_Typescript_Interface - Fatal编程技术网

Javascript 将JSON对象转换为特定类型

Javascript 将JSON对象转换为特定类型,javascript,json,typescript,interface,Javascript,Json,Typescript,Interface,我有一个JSON对象,它包含一堆字符串 { id: "1", amount: "57,000", title: "I am a test" } 如何将其转换为接口,例如: interface MyObj { id: number; amount: number; title: string; } 我需要映射每个对象属性并尝试转换为必要的类型,还是可以尝试强制将JSON对象转换为类型 为了清楚

我有一个JSON对象,它包含一堆字符串

{
    id: "1",
    amount: "57,000",
    title: "I am a test"
}
如何将其转换为接口,例如:

interface MyObj {
   id: number;
   amount: number;
   title: string;
}
我需要映射每个对象属性并尝试转换为必要的类型,还是可以尝试强制将JSON对象转换为类型

为了清楚起见,这里有一些附加信息

我有一个上面的示例对象数组,JSON所以

[
{
    id: "1",
    amount: "57,000",
    title: "I am a test"
},
{
    id: "2",
    amount: "2347,000",
    title: "I am a test as well"
}
]
此JSON对象中的所有值都是字符串。每次在TS中使用对象时,我们都希望它们的类型是正确的。例如,id和金额应该是数字,它们可以在存储到我们的状态之前进行转换


因此,我想将上面数组中的JSON对象转换为特定的接口或类型。因为类型不匹配,所以我不能只使用接口,我需要进行一些转换,或者在实际与接口对齐之前尝试转换为类型。这是一个问题,我如何映射数组中的JSON对象,并将一些键从字符串转换为数字(可能?)。

我想您要做的是通过解析JSON对象将JSON对象转换为JavaScript对象

下面是一个如何做到这一点的示例:

const json = '{"result": true, "count": 42}';
const obj = JSON.parse(json);
然后,您可以像访问常规对象一样访问新的JavaScript对象obj。它将包含与json对象中完全相同的信息

有关此方法的更多信息,请访问:


JSON.parse revivier

可以采用可选的第二个参数,即
恢复器
函数-

如果指定了
恢复程序
,则通过解析计算的值将在返回之前进行转换。具体而言,计算值及其所有属性(从最嵌套的属性开始,一直到原始值本身)分别通过
恢复器运行。然后调用它,将包含正在处理的属性的对象作为该对象,将属性名称作为字符串,并将属性值作为参数。如果
revivier
函数返回
undefined
(或者不返回任何值,例如,如果执行从函数的末尾落下),则该属性将从对象中删除。否则,该属性将被重新定义为返回值

函数MyObject({id,amount,title}){
this.id=id
这个。金额=金额
this.title=标题
}
功能恢复器(键、值){
如果(值?.id&&value?.amount&&value?.title)
返回新的MyObject(值)
其他的
返回值
}
常量json=
`[{“id”:“1”,“amount”:“57000”,“title”:“我是一个测试”},{“id”:“2”,“amount”:“13000”,“title”:“我也是测试”},{“id”:“3”,“amount”:“1000”,“title”:“我是第三个测试”},{“id”:“4”,“amount”:“200”,“某物”:“其他”},1,“foo”]`
常量数据=
parse(JSON,reviver)
for(数据的常量值)

log(value)
TypeScript只是一个开发/构建时工具;这意味着强制转换(比如将
用作
)在运行时没有任何效果,比如将字符串转换为数字。铸造或使用<代码>作为< /COD>只是一种告诉类型脚本显式地将值视为特定类型的方法。如果您尝试了以下方法:

interface MyObj {
   id: number;
   amount: number;
   title: string;
}

const data = {
    id: "1",
    amount: "57,000",
    title: "I am a test"
};

const ofType = data as MyObj;
…TypeScript将不会编译,因为
数据
与您的接口不兼容,因为类型不对齐。即使你强迫它:

const ofType = data as unknown as MyObj;
id
amount
仍将是字符串,现在您在应用程序中强制执行了一个错误

TypeScript是一种质量保证工具,用于确保代码的可靠性;它不会为表中的数据转换带来任何内容。因此,就像纯JavaScript一样,如果需要将内容从一种类型转换为另一种类型,则必须执行自定义代码。例如,如果您有已发布的已解析JSON数组:

const converted: Array<MyObj> = data.map(item => ({
  id: parseInt(item.id),
  amount: parseInt(item.replace(/,/g, '')),
  title: item.title
}));
const转换:数组=数据.map(项=>({
id:parseInt(item.id),
金额:parseInt(项目替换(/,/g,),
标题:item.title
}));
一个简单的演员阵容就可以了

看这里

var测试={
姓名:“
};
//umnown类型将是
console.log(test.name)//这很简单,就像test[“name”]。
//现在,如果你想让它成为一个特定的类型,那么
接口测试{
名称:字符串;
}
var myobj=作为Itest的测试;
//或
var myobj=测试;
//那么该属性将是已知属性
console.log(myobj.name);

您需要的是一个
parseInt()
函数

按如下方式使用:

const obj = {
    id: "1",
    amount: "57,000",
    title: "I am a test"
};

print(parseInt(obj.amount))         <-    Number and not string
print(typeof parseInt(obj.amount))         

已编辑

我注意到给定的对象与
接口MyObj

因此,您不能执行
类型断言
(不能将
用作
)。您必须将给定对象转换为您的类型

因此,您需要做的是——如果您知道给定对象是这样的:

const data: any = {
    id: "1",
    amount: "57,000",
    title: "I am a test"
}
你应该做:

const myObj: MyObj = {
   id: parseInt(data['id']),
   amount: parseInt(data['amount'].replaceAll(',','')),
   title: data['title']
}

如果你不确定它看起来像<代码>数据< /代码>考虑添加更多的验证/默认值

例如,如果数据['id']未定义,则id将为NaN
如果数据['title']未定义,可能您应该添加默认值

因为
数量
id
实际上是
字符串类型
,这在您的示例中是错误的吗?您的意思是什么?当您试图处理这些类型时-在编译时之前(生成TS源代码),在编译时,在编译时之后/在运行时?这些类型故意不匹配。这部分是问题所在。如何将包含所有字符串值的JSON对象转换为一个值得尊敬的接口。也就是说,尝试将id和number转换为number或默认值。
57000
中的逗号应该是十进制分隔符还是千位分隔符?这是否回答了您的问题?好的,如果我有一个JSON对象数组,我需要尝试将数组中的每个对象的int解析为它的类型。是的,你可以在数组中调用
map
,并在该函数中进行转换