【问题标题】:How to return a List<List<Map<String,String>>> as an output of a rest service class in json?如何返回 List<List<Map<String,String>>> 作为 json 中休息服务类的输出?
【发布时间】:2023-03-10 07:31:01
【问题描述】:

我最初编写了一个 java 应用程序(命令行应用程序),现在我试图将其转换为使用 jersey 和 jetty 嵌入的 Web 应用程序。现在作为服务休息类的输出,我需要以 json 格式输出List&lt;List&lt;Map&lt;String,String&gt;&gt;&gt;。有没有办法做到这一点?我是 servlet 和东西世界的新手.. 我试过这样: @得到 @Path("测试") @Produces(MediaType.APPLICATION_JSON) public List>> test() throws FileNotFoundException, IOException, GateException, URISyntaxException {

    System.out.println("Starting the App");
    System.out.println("Locations added successfully");
    DataFile file = new CSVDataFile();
    CommandsExecutor.outputsList.add(0, file.performReadOperation(inputFilePath));

    System.out.println("Begining execution");
    List<List<Map<String, String>>> finalOutput = CommandsExecutor.executeSequentialCommands(file);
/*  for (List<Map<String, String>> tmpList : finalOutput) { 
        for (int i = 0; i < tmpList.size(); i++) {
            Map<String, String> insideMap = tmpList.get(i);
            // for (Map.Entry<String, String> entry : insideMap.entrySet())
            // {
            // System.out.println(entry.getKey() + "/" + entry.getValue());
            // }
            JSONObject obj = new JSONObject(insideMap);
            System.out.println(obj);
        }
        System.out.println("\n");
    } */
    return finalOutput;
}  

现在我收到这样的错误:无法发送响应错误 500: javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List>>.

可以解决什么问题?提前致谢!!

【问题讨论】:

  • 我了解到,如果你正在编写一些难以理解的代码 (List>>) 是因为你做错了什么跨度>

标签: java json rest jersey-2.0


【解决方案1】:

问题的根本原因是缺少 jars。 Jersey 使用 Jackson,因此您需要下载 Jackson jar。

以下是我为一个示例应用所需要的所有 Jackson jar 的列表:

  • jackson-annotations-2.7.0.jar
  • jackson-core-2.7.0.jar
  • jackson-databind-2.7.0.jar
  • jackson-jaxrs-1.9.13.jar
  • jackson-jaxrs-base-2.2.0.jar
  • jackson-jaxrs-json-provider-2.2.0.jar
  • jackson-xc.jar

在我的示例中,我创建了以下类:

package foo;

import java.util.*;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ListWrapper 
{
    private List<List<Map<String,String>>> list;

    public List<List<Map<String,String>>> getList()
    {
        return list;
    }

    public void setList(List<List<Map<String,String>>> list)
    {
        this.list = list;
    }
}

还有这个 servlet 类:

    package foo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Path("/foo")
public class Foo  {

    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public ListWrapper getList()
    {       
        ListWrapper lw = new ListWrapper();

        HashMap<String,String> map = new HashMap<String,String>();
        map.put("foo", "bar");
        map.put("hello", "world");

        ArrayList<Map<String,String>> innerList = new ArrayList<Map<String,String>>();
        innerList.add(map);

        ArrayList<List<Map<String,String>>> outerList = new ArrayList<List<Map<String,String>>>();
        outerList.add(innerList);

        lw.setList(outerList);
        return lw;
    }
}

以下 XML 已添加到我的应用程序的 web.xml 配置中:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>foo,com.fasterxml.jackson.jaxrs.json</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

在浏览器中请求 servlet 返回以下 JSON:

{
   "list": [
      [
         {
            "foo": "bar",
            "hello": "world"
         }
      ]
   ]
}

一旦您克服了识别 Jersey 和 Jackson 的所有依赖项的困难,它们确实是非常强大的库。

【讨论】:

    【解决方案2】:

    您的结果 JSON 可能类似于:

    {
        "result": 
        [
            [ 
                {
                    "key1":"value1",
                    "key2":"value2",
                    ...
                },
                {
                    "key3":"value3", 
                    "key4":"value4"
                    ...
                }, 
                ...
            ],
            ...
         ]
    }
    

    在您注释的代码中,您实际上已经为地图创建了内部JSONObject,您只需要将它们附加到JSONArray,然后将这些JSONArrays 放入另一个JSONArray,然后将其放入最终 JSONArray 在结果 JSONObject 中返回。

    JSONObject result = new JSONObject();
    JSONArray array1 = new JSONArray();
    for (List<Map<String, String>> tmpList : finalOutput) { 
        JSONArray array2 = new JSONArray();
        for (int i = 0; i < tmpList.size(); i++) {
            Map<String, String> insideMap = tmpList.get(i);
            JSONObject obj = new JSONObject(insideMap);
            array2.add(obj);
        }
        array1.add(array2);
    }
    result.append("result", array1);
    
    return result.toString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多