gpt4 book ai didi

java - Jersey 消耗二维数组

转载 作者:行者123 更新时间:2023-12-02 04:22:45 25 4
gpt4 key购买 nike

我正在使用 jersey 开发 REST Web 服务。

我按以下格式提交数据:

var data = new Array();
data.push({ name: 'field1', value: "123" });
data.push({ name: "field2", value: "XYZ" });

现在我想以以下格式发送附加数据:

    var products = new Array();
products.push({ name: 'product1', value: "5" });
products.push({ name: 'product2', value: "8" });
products.push({ name: 'product3', value: "12" });

data.push({ name: "products", value: products });

泽西网络服务代码:

@Path("/myRequestPath")
@POST
@Produces({ MediaType.APPLICATION_JSON })
public MetaDataStatus processChangeRequest(
@FormParam("field1") String field1,
@FormParam("field2") String field2,
//how to read products here?
)
{
}

我的问题是如何在 Jersey 网络服务中使用上述产品数据?

最佳答案

不要以这种格式发送数据。使用可轻松映射到 Java 对象的对象。您需要了解的第一件事是数据在 JSON 中的外观以及映射到 Java 对象的方式。

首先你有一个数组 var data = new Array(); 。所以最初您在 JSON 中有以下内容

[]

这只是一个空数组。在 Java JSON/POJO 映射世界中,这通常映射到 Java List或纯java数组,所以你现在就拥有了

List data = new ArrayList();

然后开始添加 Javascript 对象 ( { } ),该对象映射到 JSON 对象 ( { } )。

所以在前两个添加之后,你有

[
{ name: 'field1', value: "123" },
{ name: 'field2', value: "XYZ" }
]

但是 JSON 对象 ( {..} ) 映射到 Java 对象。所以我们需要一个类来举办 namevalue字段。例如

public class KeyValuePair {
public String name;
public String value;
}

现在你有了一些映射到的东西

List<KeyValuePair> data = new ArrayList<>();
data.add(new KeyValuePair("field1", "123"));
data.add(new KeyValuePair("field2", "XYX"));

正如你所看到的,它开始看起来相当难看。这是因为您发送数据的方式。但正如您从 KeyValuePair 中看到的那样例如,Javascript 属性,即 namevalue映射到 Java 字段 namevalue 。因此,您应该做的就是忘记名称值对,并将 Javacript 对象直接映射到 Java 对象。例如

var obj = {
field1: "123",
field2: "XYZ",
products: [
{ name: "product1", price: 10 },
{ name: "product2", price: 20 },
{ name: "product2", price: 30 }
]
};
var data = JSON.stringify(obj);
$.ajax({
url:url,
data: data,
contentType: "application/json",
...
});

现在 Javacript obj会映射到 Java 就像

public class MyObject {
public String field1;
public String field2;
public List<Product> products;
// should actually be private with getters and setters
}

public class Product {
public String name;
public double price;
}

我希望您能看到 Javascript 如何直接映射到 Java 类。所以现在你可以简单地将其作为方法

@Path("/myRequestPath")
@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public MetaDataStatus processChangeRequest(MyObject obj) {}

为此,您需要确保您有 Jersey 的 JSON 提供程序。如果没有,您将收到类似“未找到媒体类型 application/json 和 Java 类型 MyObject 的 MessageBodyReader”之类的异常。如果您看到此异常,您可以使用异常消息进行谷歌搜索。有很多答案显示您需要添加的内容。我可以亲自告诉你,但你没有提供足够的信息,我无法准确地告诉你你需要什么。

如果您需要帮助来解决这个问题,请告诉我您正在使用的 Jersey 版本以及您是否使用 Maven。

更新

对于 Maven,只需添加此依赖项即可支持 JSON/POJO

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.7</version>
</dependency>

然后在您的 web.xml 中进行配置

<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>

关于java - Jersey 消耗二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32562123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com