Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Java 当JSON字段名的名称不同时,为什么要将对象字段名更改为JSON字段名?_Java_Json_Spring_Angular - Fatal编程技术网

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

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

我正在构建一个webapp,后端是java/spring,前端是angular2+。我刚刚发现了一件非常奇怪的事情。我有一个名为
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

您有两个选项来解决此问题:

  • 更改后端类上的属性名称

  • 在前端实例化期间添加一个保护,将值分配给
    localizedStoreFront
    not
    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,
      国外销售人员:国外销售人员
      }
      })
      )
      }
      
      我没有这样做……我是通过使用angulars
      httpClient
      通过
      Get-request
      检索对象。解析是由
      HttpClient
      在后台完成的,但实例化的概念是相同的。未设置属性
      localizedStoreFront
      ,因为您的响应数据不包含此类属性。拼写必须相同。但是我没有发现错误,我仍然可以使用
      localizedStorefront
      获取值!好的,今天早上我再次检查,这次当我尝试使用localizedStorefront而不是Front时,VisualStudioIDE给出了一个错误。因此,这可能是由于Visual studio中在更改某些内容后分别重新加载应用程序时出现的错误。但是,在角材质表中使用
      {{affiliateLink.localizedStorefront}
      ,而字段定义为大F时,由于某些原因仍然有效。我将关闭此线程,尽管如此,我还是很感激所有的答案。。我想visual studio不知何故愚弄了我。嗯,看来我不能再删除此线程了,因为其他人已经回复了