如何编写一个既使用XML又使用JSON的servlet程序?



我正在编写一个servlet程序,旨在接受xml和json,我在json中的请求是这样的,

{"Symbol":["OLM","ASC"]}

并且运行良好。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();
Connection connection = null;

BufferedReader reader1 = request.getReader();

StringBuffer jb = new StringBuffer();

String line = null;
while ((line = reader1.readLine()) != null) {
jb.append(line);
}

String str = jb.toString();



JSONObject obj2 = null;
try {
obj2 = new JSONObject(str);
} catch (JSONException e1) {

e1.printStackTrace();
}
JSONArray array = null;
try {
array = (JSONArray) obj2.get("Symbol");
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

我知道它正在为json工作,因为我正在将获得的字符串(在我的情况下str)转换为JSONObject,但如果我想接受XML并从中获得符号,如何更改此代码?提前感谢

我在更新我的问题,

ObjectMapper objectMapper = new ObjectMapper();



if(request.getHeader("content-type")=="application/json") {
System.out.println("json ");
Symbol symbolContainerFromJson = objectMapper.readValue(request.getReader(), Symbol.class);
System.out.println(symbolContainerFromJson.getSymbolName());
} 

else if (request.getHeader("content-type")=="application/xml") {
System.out.println("xml");
Symbol symbolContainerFromXml = new XmlMapper().readValue(request.getReader(), Symbol.class);
System.out.println(symbolContainerFromXml.getSymbolName()); 
}

但是它没有同时进入两个循环,请帮助

最健壮的反序列化方法是在后端创建数据结构,并让像Jackson这样的框架来完成繁重的工作。

因此,我们首先创建我们期望在XML或JSON中的对象表示。没有魔法,它只是一个POJO。我添加了一个JsonProperty注释,因为你希望Symbol大写,而我讨厌Java中的大写字段。

public class SymbolContainer {
@JsonProperty("Symbol")
private List<String> symbol;
public List<String> getSymbol() {
return symbol;
}
}

然后我使用Jackson Object/Xml映射器将内容从请求体转换为内存中的对象。

if(contentTypeIsJson(request.getHeader("content-type"))) {
SymbolContainer symbolContainerFromJson = new ObjectMapper().readValue("{"Symbol":["OLM","ASC"]}", SymbolContainer.class);
System.out.println(symbolContainerFromJson.getSymbol()); // [OLM, ASC]
} else if (contentTypeIsXml(request.getHeader("content-type"))) {
SymbolContainer symbolContainerFromXml = new XmlMapper().readValue("<root>n" +
"   <Symbol>n" +
"      <element>OLM</element>n" +
"      <element>ASC</element>n" +
"   </Symbol>n" +
"</root>", SymbolContainer.class);
System.out.println(symbolContainerFromXml.getSymbol()); // [OLM, ASC]
}

只使用这三个Jackson依赖项

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.5</version>
</dependency>

注意,这些objectmap是可以配置的。如果你只是感兴趣的请求的一部分(如符号),想忽略其余的传递对象,最好配置您的objectmap一样,它可以让你忽略未映射字段。

new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

相关内容

  • 没有找到相关文章

最新更新