Java 当JSON字段名的名称不同时,为什么要将对象字段名更改为JSON字段名?
我正在构建一个webapp,后端是java/spring,前端是angular2+。我刚刚发现了一件非常奇怪的事情。我有一个名为Java 当JSON字段名的名称不同时,为什么要将对象字段名更改为JSON字段名?,java,json,spring,angular,Java,Json,Spring,Angular,我正在构建一个webapp,后端是java/spring,前端是angular2+。我刚刚发现了一件非常奇怪的事情。我有一个名为AffiliateLinkDTO的对象,它从java应用程序发送到angular应用程序。接收到JSON后,JSON被序列化为前端的AffiliateLinkDTO。这两个类都应该是彼此的精确镜像。这里是两个类的代码 在前端侧附加链接到: export class AffiliateLinkDTO { constructor( public id
AffiliateLinkDTO
的对象,它从java应用程序发送到angular应用程序。接收到JSON后,JSON被序列化为前端的AffiliateLinkDTO
。这两个类都应该是彼此的精确镜像。这里是两个类的代码
在前端侧附加链接到:
export class AffiliateLinkDTO {
constructor(
public id?:number,
public affiliateLinkUrl?: string,
public localizedStoreFront?: string,
public sellerShipsAbroad?:boolean){}
}
在后端侧附加链接到:
public class AffiliateLinkDTO {
private Long id;
private String affiliateLinkUrl;
private LocalizedStorefront localizedStorefront;
private boolean sellerShipsAbroad;
}
正如您所看到的,除了一个小细节外,这两个都是彼此的精确图像,后端的localizedStorefront的F与前端的F不同,都是大写的。奇怪的是,这并没有在前端导致错误,但它变得更加奇怪
当我在前端打印出affiliateLinkDTO.localizedStoreFront
实例的affiliateLinkDTO.localizedStoreFront
字段时,它打印出未定义的
,但当我打印出affiliateLinkDTO.localizedStoreFront
(带有一个小f)时,它打印出值!当前端的AffiliateLinkDTO上不存在localizedStorefront字段时,这怎么可能???即使类AffiliateLinkDTO用于实例化对象,字段名也奇迹般地更改为localizedStorefront
。谁能给我解释一下吗?我真的很困惑。多谢各位
PS:JSON没有手动解析为AffiliateLinkDTO,我使用HttpClient向后端发出get请求,JSON自动解析为AffiliateLinkDTO
编辑:我所看到的是由visual studio中的一个错误引起的,我重新检查了是否可以重现昨天看到的内容,但这次无法重现,因为我遇到了一个编译器错误。我假设您正在这样做,以便从JSON创建
附件LinkDTO
实例:
let dto = new AffiliateLinkDTO();
let obj = JSON.parse(receivedJson);
for(let attr in obj){
dto[attr] = obj[attr];
}
在这种情况下,localizedStoreFront
是未定义的,因为它从未设置过,因为收到的JSON只包含一个名为localizedStoreFront
的属性,而不是localizedStoreFront
您有两个选项来解决此问题:
- 更改后端类上的属性名称
- 在前端实例化期间添加一个保护,将值分配给
和not到localizedStoreFront
localizedStoreFront
- Maurice,当您创建httpClient.get
getAffiliateLinkDTO(id:number):Observable<AffiliateLinkDTO>
{
return this.httpClient<AffiliateLinkDTO>.get(".....").pipe(
map(res=>{
return {
id:res.id,
affiliateLinkUrl:res.affiliateLinkUrl,
LocalizedStoreFront:res.localizedStorefront,
sellerShipsAbroad:res.sellerShipsAbroad
}
})
)
}
getAffiliateLinkDTO(id:number):可观察
{
返回此.httpClient.get(“…”)管道(
地图(res=>{
返回{
id:res.id,
affiliateLinkUrl:res.affiliateLinkUrl,
LocalizedStoreFront:res.LocalizedStoreFront,
国外销售人员:国外销售人员
}
})
)
}
我没有这样做……我是通过使用angularshttpClient
通过Get-request
检索对象。解析是由HttpClient
在后台完成的,但实例化的概念是相同的。未设置属性localizedStoreFront
,因为您的响应数据不包含此类属性。拼写必须相同。但是我没有发现错误,我仍然可以使用localizedStorefront
获取值!好的,今天早上我再次检查,这次当我尝试使用localizedStorefront而不是Front时,VisualStudioIDE给出了一个错误。因此,这可能是由于Visual studio中在更改某些内容后分别重新加载应用程序时出现的错误。但是,在角材质表中使用{{affiliateLink.localizedStorefront}
,而字段定义为大F时,由于某些原因仍然有效。我将关闭此线程,尽管如此,我还是很感激所有的答案。。我想visual studio不知何故愚弄了我。嗯,看来我不能再删除此线程了,因为其他人已经回复了