将 Javascript 数组与 Java 列表匹配

Posted

技术标签:

【中文标题】将 Javascript 数组与 Java 列表匹配【英文标题】:Matching Javascript Array to Java list 【发布时间】:2021-06-06 07:49:00 【问题描述】:

我正在从前端 (Angular) 向后端 (Java) 发出 POST 请求。发布请求作为 JSON 对象(由多个数组组成)发送,在 Java 中,应该与数组打算作为列表的对象匹配。这是一个表示问题的示例代码,因为这不是实际代码,因为它属于工作并且不希望有任何机密性问题,所以这只是为了尽可能接近原始代码来表示问题(值得注意的是,有很多存储的学校,并且为了论证,他们可以由他们的学生和所教授的课程唯一标识,并使用此信息,我们希望获得该学校的教室):

Angular 服务 api 调用:

getSchool(students, lessons): Promise<School> 
  return this.http.post('sampleurl/clas-s-room', JSON.stringify(students:students, lessonsTaught:lessons), headers:this.headers)
  .toPromise()
  .then(res => <School>res.json())
  .catch(this.handleError);

Angular School 模型:

export class School 
  public students:any;
  public lessonsTaught:string[];
  public clas-s-rooms:string[];

  constructor() 

Java 学校对象:

public class School 
  private List<Student> students;
  private List<String> lessonsTaught;
  private List<String> clas-s-rooms;

  public School() 
  
  public List<Student> getStudents() 
    return students;
  

  public void setStudents(List<Student> students) 
    students = this.students;
  

  public List<Stream> getLessonsTaught() 
    return students;
  

  public void setLessonsTaught(List<String> lessonsTaught) 
    lessonsTaught = this.lessonsTaught;
  

  public List<String> getClas-s-rooms() 
    return clas-s-rooms;
  

  public void setClas-s-room(List<String> clas-s-room) 
    clas-s-room = this.clas-s-room;
  

Java SearchSchool 对象:

public class SearchSchool 
  private List<String> students;
  private List<String> lessonsTaught;

  public School() 
  
  public List<Student> getStudents() 
    return students;
  

  public void setStudents(List<Student> students) 
    students = this.students;
  

  public List<Stream> getLessonsTaught() 
    return students;
  

  public void setLessonsTaught(List<String> lessonsTaught) 
    lessonsTaught = this.lessonsTaught;
  

Java 端点:

@RequestMapping(value="sampleurl/clas-s-room", method = RequestMethod.POST)
public School(@RequestBody SearchSchool searchSchool) 
  return service.getSchool(searchSchool);

如此有效,我使用 Java 中的 SearchSchool 对象来唯一标识学校并将其返回。但是,传递到端点的数组似乎与 SearchSchool 对象所需的列表不匹配(我在端点的条目上放置了一个断点,它甚至没有被执行)。稍微玩了一下代码,Angular 中学生的字符串数组与 Java 中学生的字符串列表的匹配似乎工作正常,问题似乎是将教授的课程数组与教授的课程列表相匹配在 Chrome 中的开发者控制台中给我以下运行时错误:

An error occurred syntaxError: service.ts: 163
Unexpected token A in JSON at position o
at JSON.parse (<anonymous>)
at Response.Body.json (http.ess.js:796)
at duration service.ts:54
at ZoneDelegate.invoke (zone.js:365)
at object.onInvoke (core.ess.js:4145)
at ZoneDelegate.invoke (zone.js:364)
at zone.run (zone.js:125)
at zone.js:760
at ZoneDelegate.invokeTask (zone.js:398)
at object.on InvokeTask (core.ess.js:4136)
at ZoneDelegate.invokeTask (zone.js:397)
at Zone.runTask (zone.js:165)
at drainMicroTaskQueue (zone.js:593)
at XMLHttpRequest. ZoneTask.invoke (zone.js:464)

和:

ERROR Error: Uncaught (in promise): core.es5.js:1085
Unexpected token A in JSON at position o
at resolvePromise (zone.js:683) [angular]
at :8080/gar-app/polyfis:7034:17 [angular)
at object.onInvokeTask (core.ess.js:4136) [angular]

有谁知道为什么从前端的数组匹配到后端的列表会导致这样的问题?

【问题讨论】:

在浏览器控制台检查请求,是请求还是响应无效的json? console.log res 在返回 &lt;School&gt;res.json() 之前。您的回复可能与您的预期不同 @luk2302 请求似乎根本不包含 JSON 【参考方案1】:

尝试传递一个对象而不是 JSON,只需删除 JSON.stringify()

getSchool(students, lessons): Promise<School> 
  return this.http.post('sampleurl/clas-s-room', students:students,lessonsTaught:lessons, headers:this.headers)
  .toPromise()
  .then(res => <School>res.json())
  .catch(this.handleError);

【讨论】:

【参考方案2】:

前后端字段名不匹配

在前端,您正在通过课程,在后端,您正在期待课程学习

修改任何一个以使代码工作

更改后前端将如下所示

getSchool(students, lessons): Promise<School> 
  return this.http.post('sampleurl/clas-s-room', JSON.stringify(students:students, lessonsTaught:lessons), headers:this.headers)
  .toPromise()
  .then(res => <School>res.json())
  .catch(this.handleError);


【讨论】:

不,这是JSON.parse 错误。 &lt;School&gt; 只是在编译时,不会抛出不匹配错误 你是说端点没有命中对吗? 不,我是说端点可能没有发送有效的 json 或者可能发送某种错误... Angular 中的学生字符串数组与 Java 中的学生字符串列表的匹配似乎工作正常,并且问题似乎是将教授的课程数组与教授的课程列表相匹配 - 你可以尝试改变 Except.. 映射发生在 JSON.parse 之后,这就是引发错误的原因。无论哪种方式,OP 都需要指定返回什么 res

以上是关于将 Javascript 数组与 Java 列表匹配的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 列表转换为 javascript 数组

如何使用 jsp 将 java 数组传输到 javaScript 数组?

如何将数组列表的相等性与现代 Java 进行比较?

javascript 匹配列表项与对象数组

怎样将JAVA中得list集合转换为javascript的二维数组?

将 Javascript 数组转换为 C# 列表