如何编写同时使用 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)