如何编写同时使用 XML 和 JSON 的 servlet 程序?
How to write a servlet program which consume both XML and JSON?
我正在写一个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>
请注意,可以配置这些 ObjectMappers。如果您只对请求的一部分感兴趣(例如 Symbol)并且想忽略传递对象的其余部分,最好像这样配置您的 ObjectMapper,这样您就可以忽略未映射的字段。
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
我正在写一个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>
请注意,可以配置这些 ObjectMappers。如果您只对请求的一部分感兴趣(例如 Symbol)并且想忽略传递对象的其余部分,最好像这样配置您的 ObjectMapper,这样您就可以忽略未映射的字段。
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)