当JSON字段名称不同时,为什么将对象字段名称更改为JSON字段名称?

时间:2018-09-04 18:24:06

标签: java json spring angular

我正在构建一个Webapp,在后端使用java / spring,在前端使用angular 2+。我刚刚发现了一些非常非常奇怪的东西。我有一个名为AffiliateLinkDTO的对象,它从Java应用程序发送到Angle应用程序。收到JSON后,它会在前端序列化为AffiliateLinkDTO。这两个类都应该是彼此的精确镜像。这是两个类别的代码。

前端的AffiliateLinkDTO:

export class AffiliateLinkDTO {
    constructor(
        public id?:number,
        public affiliateLinkUrl?: string,
        public localizedStoreFront?: string,
        public sellerShipsAbroad?:boolean){}
}

后端的AffiliateLinkDTO:

public class AffiliateLinkDTO {
    private Long id;
    private String affiliateLinkUrl;
    private LocalizedStorefront localizedStorefront;
    private boolean sellerShipsAbroad;
}

正如您所看到的,两者都是彼此的精确图像,只是细节有所不同,后端上localizedStorefront的F不像前端上的对应大写。奇怪的是,这不会导致正面错误,但会变得更奇怪。

当在前端我打印出affiliateLinkDTO.localizedStoreFront实例的字段AffiliateLinkDTO时,它打印出undefined,但是当我打印出affiliateLinkDTO.localizedStorefront(带有小f)时,它打印值了!当前端的AffiliateLinkDTO上不存在localizedStorefront字段时,怎么办?即使使用类AffiliateLinkDTO实例化该对象,该字段名也会奇迹般地更改为localizedStorefront。谁能给我一个解释?我对此感到非常困惑。谢谢。

PS:JSON不会手动解析为AffiliateLinkDTO,我正在使用HttpClient向后端发出get请求,并且JSON自动解析为AffiliateLinkDTO

编辑:我看到的是Visual Studio中的错误引起的,我重新检查是否可以重现昨天看到的内容,但是这次却无法编译。

2 个答案:

答案 0 :(得分:0)

我假设您正在执行类似的操作以从JSON创建AffiliateLinkDTO实例:

let dto = new AffiliateLinkDTO();
let obj = JSON.parse(receivedJson);

for(let attr in obj){
    dto[attr] = obj[attr];
}

在那种情况下,localizedStoreFront是未定义的,因为它从未设置,因为接收的JSON仅包含一个名为localizedStorefront的属性,而不包含localizedStoreFront

您可以通过以下两种方法解决此问题:

  • 更改后端类的属性名称

  • 在前端实例化期间添加防护,以将值分配给localizedStoreFront,将分配给localizedStorefront

答案 1 :(得分:0)

莫里斯(Maurice),当您创建httpClient.get <接口>(...)角度时不检查收到的值。您收到了。使用的想法是在编写代码时为您提供帮助。如果需要,您可以像“ p”那样映射响应

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
          }
       })
    )
}