[英]Parsing an JSON Object and Array from REST
我想将以下JSON从REST解析为JAVA。 我有一个AR对象和一个方法,并以wine为参数。 我该怎么办?
{
"type": "AR",
"selection_month": "Feb/2015",
"wines": [
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "The Mission",
"grape": "Merlot",
"region": "Napa",
"country": "USA",
"maker": "Sterling",
"year": "2014"
},
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "Joseph Phelps Cabernet Sauvignon 2012",
"grape": "Cabernet Sauvignon",
"region": "Napa",
"country": "USA",
"maker": "Joseph Phelps",
"year": "2012"
},
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "Round Pond Estate Rutherford",
"grape": "Cabernet Sauvignon",
"region": "Napa",
"country": "USA",
"maker": "Rutherford",
"year": "2014"
},
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "Dona Paula Black Label",
"grape": "Bordeaux",
"region": "",
"country": "Argentina",
"maker": "Dona Paula",
"year": "2013"
},
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "Schug Sonoma Coast Pinot Noir",
"grape": "Pinot Noir",
"region": "Sonoma Valley",
"country": "USA",
"maker": "Walter Schug",
"year": "2013"
},
{
"variety": "RED",
"wine_type": "TABLE",
"label_name": "Caymus Special Selection Cabernet Sauvignon",
"grape": "Cabernet Sauvignon",
"region": "Napa Valley",
"country": "USA",
"maker": "Charles F. Wagner",
"year": "2014"
}
]
}
我有以下方法
@POST
public Response addAR(InputStream incomingData){
String parsedJson = jsonStreamToString(incomingData);
try {
JSONObject json = new JSONObject(parsedJson);
String name = json.getString("name");
int uid = useCase.createAR(name);
JSONObject jsonResponse = new JSONObject(new JSONStringer().object()
.key("id").value(uid).endObject().toString());
return Response.status(201).entity(jsonResponse.toString()).build();
} catch (JSONException e) {
e.printStackTrace();
return Response.status(404).entity(e.toString()).build();
}
}
我建议不要尝试自己解析所有内容,并使用POJO。 让Jackson将JSON解析到您的POJO中。 Wine可以是一个类,而AR
可以是具有List<Wine>
“我正在使用Jersey JAX_RS 2.0”
要获得Jackson支持,如果您使用的是Maven,只需添加此依赖项
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
如果您不使用Maven,请下载这些jar
jersey-media-json-jackson-选择版本(与您的Jersey 2.x版本匹配,然后下载)
从下图获取所有内容
我从v2.2.3-的另一个帖子中获得了一个图像,而忽略了该版本。 您希望所有版本都获得2.3.2的版本。 对于第一个依赖项,都可以在上面的链接中找到它们。 只需在搜索栏中搜索它们即可。 找到它后,选择版本并下载。
一旦有了所有的jar /依赖关系,您就可以简单地使用从JSON转换的POJO。 例如,您可以Wine
课
public class Wine {
private String variety;
@JsonProperty("wine_type")
private String wineType;
@JsonProperty("label_name")
private String labelName;
private String grape;
private String country;
private String maker;
private String year;
// proper Getters and Setters mathing for form
// public String getVariety()
// public void setVariety(String variety)
// basically following JavaBean naming convention
}
您将需要适当的JavaBean风格的getter和setter。 您会注意到其中两个字段具有@JsonProperty
批注。 这是因为带有_
(下划线)的JSON属性无法很好地映射到方法,因此我们需要命名该属性。
然后,您可以拥有另一个具有List<Wine>
,以及顶级JSON对象的其他属性。 例如
public class AR {
private String type;
@JsonProperty("selection_month")
private String selectionMonth;
private List<Wine> wines;
// Getters and Setters
}
现在,您可以简单地将AR
类型用作方法参数。 您可以直接使用AR
对象
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addAR(AR ar){
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.