如何保留循环添加对象到List的同时去除JSON字符串的数组括号
问题描述
我在循环中为对象添加属性,最终需要生成一个可作为查询参数的字符串,期望格式如下:
{"items":[{"itemsCode":"item1","isAvailable":false}],"isActive":false},{"items":[{"entryCode":"item2","isSelected":true}],"isActive":false}
但我用以下代码实现时:
List<Items> itemsList= new ArrayList<>(); itemsList.add(new Items(items, isBoolean)); ObjectMapper mapper = new ObjectMapper(); String itemsJson = mapper.writeValueAsString(itemsList);
对应的POJO:
public class Items { private List<Item> items; private Boolean isBoolean; }
得到的结果是带外层数组括号的JSON:
[{"items":[{"itemsCode":"item1","isAvailable":false}],"isActive":false},{"items":[{"entryCode":"item2","isSelected":true}],"isActive":false}]
需要保留for循环将对象添加到List的实现方式,同时去除外层的数组括号。
解决方案
方法一:序列化后截取字符串
这是最简单直接的方式,List序列化后必然以[开头、]结尾,直接截取中间部分即可:
List<Items> itemsList= new ArrayList<>(); // 循环中添加Items对象到list itemsList.add(new Items(items1, false)); itemsList.add(new Items(items2, false)); ObjectMapper mapper = new ObjectMapper(); String itemsJson = mapper.writeValueAsString(itemsList); // 移除首尾的数组括号 String result = itemsJson.substring(1, itemsJson.length() - 1);
方法二:逐个序列化并拼接
如果担心字符串截取的潜在风险(比如极端场景下JSON内容本身包含首尾方括号),可以遍历List,逐个序列化每个对象后用逗号拼接:
List<Items> itemsList= new ArrayList<>(); // 循环中添加Items对象到list itemsList.add(new Items(items1, false)); itemsList.add(new Items(items2, false)); ObjectMapper mapper = new ObjectMapper(); StringBuilder sb = new StringBuilder(); for (Items item : itemsList) { if (sb.length() > 0) { sb.append(","); } sb.append(mapper.writeValueAsString(item)); } String result = sb.toString();
额外修正:POJO字段名匹配
你的期望输出中字段是isActive,但POJO里定义的是isBoolean,需要给POJO字段添加@JsonProperty注解指定序列化后的字段名,否则输出字段名会和预期不符:
import com.fasterxml.jackson.annotation.JsonProperty; public class Items { private List<Item> items; @JsonProperty("isActive") private Boolean isBoolean; // 构造方法、getter/setter省略 }
内容的提问来源于stack exchange,提问作者jacob1989
相关产品推荐
相关产品推荐

