首页 文章

如何将List <List <Map <String,String >>>作为json中的rest服务类的输出返回?

提问于
浏览
2

我最初编写了一个java应用程序(命令行应用程序),现在我正在尝试使用jersey和jetty embeded将其转换为Web应用程序 . 现在作为服务休息类的输出,我需要以json格式输出 List<List<Map<String,String>>> . 有办法实现这个目标吗?我是servlet和东西的新手 . 我试过这样:@GET @Path("test")@Produces(MediaType.APPLICATION_JSON)public List >> test()抛出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:找不到媒体类型= application / json的MessageBodyWriter,type = class java.util .ArrayList,genericType = java.util.List >> .

可能是什么工作?提前致谢!!

2 回答

  • 2

    问题的根本原因是缺少 jar . 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 的所有依赖关系的斗争,它们就是非常强大的库 .

  • 1

    你的结果JSON可能是这样的:

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

    在您的注释代码中,您实际上已经为 Map 创建了内部 JSONObject ,您只需要将它们附加到 JSONArray ,然后将这些 JSONArray s放入另一个 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();
    

相关问题