如何从服务器端对象调用 javascript 对象的属性/方法

Posted

技术标签:

【中文标题】如何从服务器端对象调用 javascript 对象的属性/方法【英文标题】:How to call properties/methods of a javascript object from server side object 【发布时间】:2017-02-25 21:32:27 【问题描述】:

我通常使用 C#、jQuery 2.x、Chrome 作为这样的浏览器从 restful 资源 Web Api 2 获取 js 对象

C#

public class Employee

   private int id;
   private string firstName;
   private string lastName;

   public int ID
   
      get return this.id; 
      set this.id = value; 
   

   public string FirstName
   
      get return this.firstName; 
      set this.firstName = value; 
   

   public string LastName
   
      get return this.lastName; 
      set this.lastName = value; 
   

   public string FullName
   
      get return this.firstName + " " + this.lastName; 
      

我有一个这样的控制器

public class EmployeeController : ApiController


   [HttpGet]
   public Employee GetEmployee(int id)
   
      return EmployeeService.Instance.GetEmployee(id);
   


然后在我的js中我这样调用资源

function getEmployee(id) 
    $.ajax(
        type: "GET",
        url: "localhost:8080/Employee/" + id,
        success: bindEmployee
    );


function bindEmployee(employee)
   alert(employee.FullName);

Java

现在我想使用 Jersey 2.23、Java json 1.0、Tomcat 8 在 Java 中做同样的事情。所以我的班级 Employee

public class Employee
  private int ID;
  private string firstName;
  private string lastName;

  //regular getter and setter methods

  public string getFullName()
     return this.firstName + " " + this.lastName;
  

这是我宁静的资源

@Path("/employee")
public class EmployeeController 

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getEmployee(@PathParam("id") long id) throws JSONException
        Employee employee = new Employee();
        employee.setId(id);
        employee.setFirstName("john");
        employee.setLastName("smith");
        return Response.status(200).entity(employee).build();
    

我像这样用 angularjs 中的 $http 对象调用 restful 资源

return $http(
 method : 'GET',
 url : 'localhost:8080/employee/1',
).then(onSuccess, onError);

function onSuccess(response)
   return response.data;


function onError(response)
//

响应数据是我的员工,但我只能看到私有成员,但我无法调用 getFullName 方法。不在 JSON 字符串中,它是一个 javascript 对象。

是否有在 javascript 中调用 getFullName 的解决方法?我想避免像这样 firstName + " "+ lastName 这样的客户端连接。

这是 Chrome 中开发者工具的输出。

【问题讨论】:

问题很不清楚。在哪里使用什么语言(客户端/服务器/浏览器)?无论语言如何,实际传输的 JSON 数据是否总是相同的,它是什么样的? 我更新了我的问题。 顺便说一句,为什么要关闭投票。用户可以好心解释一下原因吗? 您是否阅读了Jersey document about JSON,其中指定了如何控制 POJO 映射到 JSON 的方式?它有您正在寻找的答案,就像大多数文档一样。 【参考方案1】:

在您的情况下,Java 对象被序列化为 JSON 以通过线路发送到浏览器,但 fullName 字段没有与对象一起序列化。虽然 javascript 无法访问 getFullName 方法,但您可以序列化任意字段,例如在 Java 端包含 fullName 字段。我不知道您在 Jersey 中使用的是什么序列化库,但如果您使用的是 Jackson,您可以简单地将方法注释为 JSON 属性:

@JsonProperty("fullName")   
public string getFullName() 
    return this.firstName + " " + this.lastName;   

您还可以使用 Moesif 和 Fiddler 等工具查看通过网络传输的有效负载。

【讨论】:

请在回答中明确提及您与 Moesif 的关系;否则,它可能被视为垃圾邮件。详情请参阅the help center here。谢谢。【参考方案2】:

在 c# 中,您的 GetFullName 是一个属性。 在 Java 中,它是一个函数。

JSON 仅序列化属性。如果您希望您的 Java 对象序列化 FullName,您必须将其转换为属性或对其进行注释。

【讨论】:

你有一些代码要显示吗?感谢edit,你能做到吗? @Derrick 在上面发布了代码。这可以解决问题。唯一的问题是,没有二传手。但既然你不会设置属性服务器端它应该没问题。

以上是关于如何从服务器端对象调用 javascript 对象的属性/方法的主要内容,如果未能解决你的问题,请参考以下文章

使用服务器端语言作为 Javascript 的 JSONP 调用

我可以通过 ASP.NET 将对象从客户端 javascript 发送到服务器端代码吗?

如何从JSP页面调用RestFul Webservice并使用JSON对象?

如何从API调用中选择单个JavaScript对象/ JSON项目

如何从调用对象中获取 IP 地址

从 Javascript 中的事件侦听器调用访问对象的属性