Java 春季MVC杰克逊与订单
我需要从ajax调用返回一个有序字符串列表 我的DTO有一个属性大小,它是一个字符串值列表,例如:36,38,40/46,46,S,XS,M,L 我的比较器和排序算法工作得很好,大小列表被很好地排序,直到它转换成json格式,我发现一个完全不同的顺序Java 春季MVC杰克逊与订单,java,json,spring-mvc,jackson,Java,Json,Spring Mvc,Jackson,我需要从ajax调用返回一个有序字符串列表 我的DTO有一个属性大小,它是一个字符串值列表,例如:36,38,40/46,46,S,XS,M,L 我的比较器和排序算法工作得很好,大小列表被很好地排序,直到它转换成json格式,我发现一个完全不同的顺序 @ResponseBody @RequestMapping(value = PRODUCT_CODE_PATH_VARIABLE_PATTERN + "/crossell", method = RequestMethod.GET) public P
@ResponseBody
@RequestMapping(value = PRODUCT_CODE_PATH_VARIABLE_PATTERN + "/crossell", method = RequestMethod.GET)
public ProductData cosselProductDetail(@PathVariable("productCode") final String productCode,
final HttpServletResponse response) throws CMSItemNotFoundException,
UnsupportedEncodingException
{
Collections.sort(sortedSizes,mycomparator);
productData.setSizes(sortedSizes);
return productData;
}
spring配置是默认配置,没有添加或修改任何内容
<!-- activates annotation driven binding -->
<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" validator="validator">
<mvc:message-converters>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
在四处搜索之后,我找到的是序列化键config:SORT\u PROPERTIES\u,它按字母顺序排列属性,而不是值
谢谢这不是答案,但我这样发帖是因为它更容易格式化。不管是LinkedHashMap,我仍然相信序列化将保持秩序。我很好奇,所以我打了一些类似的例子,比如:
@ResponseBody
@RequestMapping(value = "/crossel", method = RequestMethod.GET)
public ProductData cosselProductDetail() {
List<String> sortedSizes = new LinkedList<>();
sortedSizes.add("11");
sortedSizes.add("8");
sortedSizes.add("10");
sortedSizes.add("15");
sortedSizes.add("20");
sortedSizes.add("5");
sortedSizes.add("3");
sortedSizes.add("7");
sortedSizes.add("40");
Map<String, String> linkedHS = new LinkedHashMap<>();
Collections.sort(sortedSizes, new ValueComparator(linkedHS));
for (String key : sortedSizes) {
linkedHS.put(key, "test");
}
ProductData productData = new ProductData();
productData.setSizes(linkedHS);
return productData;
}
class SizeComparator implements Comparator<String> {
@Override
public int compare(String e1, String e2) {
if (e1.length() == 1) e1 = "0" + e1;
if (e2.length() == 1) e2 = "0" + e2;
return e1.compareTo(e2);
}
}
class ProductData {
Map<String, String> sizes;
public Map<String, String> getSizes() {
return sizes;
}
public void setSizes(Map<String, String> sizes) {
this.sizes = sizes;
}
}
请记住,键是自定义排序的。因此,在SpringMVC3.2+中,或多或少带有默认配置,我希望保留顺序。发布您的代码,不必担心问题过于复杂,应该是可修复的什么是
productData.sizes
?一个简单的列表有一个强有力的论据,如果顺序很重要,那么它不是真正的JSON,这里讨论得很好,很遗憾,我希望默认配置在转换后保留顺序。请原谅我的提问,但你确定这就是你失去排序的原因吗。另外,你能检查(在调试器中)并粘贴sizes列表的具体实现吗更具体地说,sizes是linkedHashMap(OffeProption extends ProductDTO)我丢失了键的顺序我恐怕我错过了解释问题时我说的只是一个列表,这有什么区别吗?谢谢
{"sizes":{"3":"test","5":"test","7":"test","8":"test","10":"test","11":"test","15":"test","20":"test","40":"test"}}