使用单个对象序列化List作为JSON对象而不是JSON数组

时间:2016-06-03 07:40:19

标签: java json spring spring-mvc jackson

在Spring MVC中,Rest Controller方法将List作为JSON数组转换为单个对象:

{
["TestValue"]
}

但我的要求是,它应该转换为

{"TestValue"}

因此,只要list包含单个值,JSON序列化程序就应该将列表转换为JSON对象而不是JSON数组。

有关在Spring4 MVC中配置Jackson的任何建议吗?

由于 -trim

2 个答案:

答案 0 :(得分:0)

如果您想使用自己的协议,可以从Spring Controller的方法返回String。我给你写了一个小例子。我使用“jackson-jaxrs-json-provider”进行映射。你可以创建自己的转换bean的函数。这很容易。

例如,您有一个班级:

public class MyBean {
    private String name;
    private String value;
    private List<MyBean> beanList = new ArrayList<>();

    public MyBean(String name, String value, MyBean previous) {
        this.name = name;
        this.value = value;
        if (previous != null)
            this.beanList.add(previous);
    }

    //getters & setters
}

您创建简单的转换功能:

public static String convertToMyJson(Object value) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        String resultList = mapper.writeValueAsString(value);
        resultList = "{" + resultList.replaceAll("(^\\[)|(\\]$)", "") + "}";
        System.out.println(resultList);
    }
    catch(Exception e) {
        e.printStackTrace(System.err);
    }
    return "";
}

最后,您只需在Spring MVC Controller中返回简单字符串:

@RequestMapping(path = "get-bean", method = RequestMethod.GET)
public String getBean() {
    MyBean bean1 = new MyBean("name1", "11", null);
    MyBean bean2 = new MyBean("name2", "22", bean1);
    List<MyBean> beanList = new ArrayList<>();
    beanList.add(bean1);
    beanList.add(bean2);

    return convertToMyJson(beanList);
}

你会得到类似的东西:

{  
   {  
      "name":"name1",
      "value":"11",
      "beanList":[
      ]
   },
   {  
      "name":"name2",
      "value":"22",
      "beanList":[  
         {  
            "name":"name1",
            "value":"11",
            "beanList":[  
            ]
         }
      ]
   }
}

答案 1 :(得分:0)

如果您知道列表包含单个对象,则可以序列化列表的第一个元素而不是整个列表。

但是如果你的列表可以包含任意数量的对象(零,一,多),那么以不同方式处理单元素列表的情况可能是个坏主意。如果你这样做,那么接收JSON的客户端/服务现在必须处理两种不同的形状&#34; JSON。这使得它变得更加复杂......最小的实际利益 1

1 - 寻找&#34;整洁&#34;这不是一个实实在在的好处。保存2个字符不太可能产生显着差异。