Java 如何将HashMap序列化为ArrayList和JSON?

Java 如何将HashMap序列化为ArrayList和JSON?,java,json,arraylist,hashmap,jackson,Java,Json,Arraylist,Hashmap,Jackson,我有一个模型,它有一个HashMap,如下所示: private Map<String, String> attrMap = new HashMap<String, String>(); 但我想将此字段序列化为如下对象的ArrayList: attrMap.add("name", "value of name"); attrMap.add("content", "value of content"); [{name: "value of name"},

我有一个模型,它有一个
HashMap
,如下所示:

private Map<String, String>     attrMap     = new HashMap<String, String>();
但我想将此字段序列化为如下对象的
ArrayList

attrMap.add("name", "value of name");
attrMap.add("content", "value of content");
[{name: "value of name"}, {content: "value of content"}]
@JsonSerializer(serializeAttrMap)
private Map<String, String>     attrMap     = new HashMap<String, String>();

public String serializeAttrMap() {
    ArrayList<String> entries = new ArrayList<>(this.attrMap.size());
    for(Map.Entry<String,String> entry : attrMap.entrySet())
        entries.add(String.format("{%s: \"%s\"}",
            entry.getKey(), entry.getValue()));
    return Arrays.toString(entries.toArray());
}
更新1

有没有一种方法可以在序列化过程中调用函数,如下所示:

attrMap.add("name", "value of name");
attrMap.add("content", "value of content");
[{name: "value of name"}, {content: "value of content"}]
@JsonSerializer(serializeAttrMap)
private Map<String, String>     attrMap     = new HashMap<String, String>();

public String serializeAttrMap() {
    ArrayList<String> entries = new ArrayList<>(this.attrMap.size());
    for(Map.Entry<String,String> entry : attrMap.entrySet())
        entries.add(String.format("{%s: \"%s\"}",
            entry.getKey(), entry.getValue()));
    return Arrays.toString(entries.toArray());
}
我是
Jackson

的初学者,请尝试使用and values方法,该方法返回一组键和值,然后使用以下命令转换为arraylist:

List<String> keyList = new ArrayList<>(attrMap.keySet());
List<String> valueList = new ArrayList<>(attrMap.values());
final Map<String, String>     attrMap     = new HashMap<String, String>();
attrMap.put("name", "value of name");
attrMap.put("content", "value of content");
List<String> keyList = new ArrayList<>(attrMap.size());
for (Map.Entry<String, String> entry : attrMap.entrySet()) {//iterate over map
  keyList.add("{" + entry.getKey() + ": \"" + entry.getValue() + "\"}");//add key followed by value
}
System.out.println(keyList);

Output:
[{name: "value of name"}, {content: "value of content"}]
List keyList=newarraylist(attrMap.keySet());
List valueList=newarraylist(attrMap.values());
要非常具体地回答您的问题,您需要以下内容:

List<String> keyList = new ArrayList<>(attrMap.keySet());
List<String> valueList = new ArrayList<>(attrMap.values());
final Map<String, String>     attrMap     = new HashMap<String, String>();
attrMap.put("name", "value of name");
attrMap.put("content", "value of content");
List<String> keyList = new ArrayList<>(attrMap.size());
for (Map.Entry<String, String> entry : attrMap.entrySet()) {//iterate over map
  keyList.add("{" + entry.getKey() + ": \"" + entry.getValue() + "\"}");//add key followed by value
}
System.out.println(keyList);

Output:
[{name: "value of name"}, {content: "value of content"}]
final Map attrMap=new HashMap();
attrMap.put(“名称”、“名称值”);
attrMap.put(“内容”、“内容的价值”);
List keyList=newarraylist(attrMap.size());
对于(Map.Entry:attrMap.entrySet()){//遍历映射
keyList.add(“{”+entry.getKey()+”:\”+entry.getValue()+“\”}”);//添加键,后跟值
}
System.out.println(键列表);
输出:
[{name:“name的值”},{content:“content的值”}]

旁注:这似乎是你们的文章中的打字错误,因为地图中并没有添加方法。希望你的意思是“放”,而不是“加”。还有一些实用程序,如Gson、jackson等,可用于转换为json对象。

以下构造将创建所需的输出:

@Test
public void testJackson() throws JsonProcessingException {
    // Declare the map
    Map<String, String> attrMap = new HashMap<>();

    // Put the data in the map
    attrMap.put("name", "value of name");
    attrMap.put("content", "value of content");

    // Use an object mapper
    final ObjectMapper objectMapper = new ObjectMapper();

    // Collect to a new object structure
    final List<ObjectNode> collected = attrMap.entrySet()
            .stream()
            .map(entry -> objectMapper.createObjectNode().put(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());

    // The output
    final String json = objectMapper.writeValueAsString(collected);

    System.out.println(json); // -> [{"name":"value of name"},{"content":"value of content"}]
}

通过这种方式,序列化被外部化到序列化程序中,并且POJO是完整的。

如果您不介意手动执行,那么使用以下代码(未测试,但应该可以工作):

arraylistentries=newarraylist(attrMap.size());
对于(Map.Entry:attrMap.entrySet())
entries.add(String.format(“{%s:\%s\”}”),
entry.getKey(),entry.getValue());
返回Arrays.toString(entries.toArray());

这可能是最简单的方法,因为如果要使用JSON库,您必须修改输出(不推荐,因为它会带来糟糕的可维护性),或者为HashMap编写一个自定义序列化程序/反序列化程序,这将更加复杂。

因此,构建一个ArrayList,然后将其序列化。@RasoolGhafari-我已经更新了我的答案以反映您的更新。请注意,无法完全按照您要求的方式使用
@JsonSerialize
-注释。您需要提供一个继承
JsonSerializer
的类。我认为直接编写条目集也会得到相同的结果:objectMapper.writeValueAsString(attrMap.entrySet())@ArneBurmeister-这不太正确。如果以这种方式打印,您将获得所有条目的键和值。请参阅以下示例:
[{“key”:“name”,“value”:“value of name”},{“key”:“content”,“value”:“value of content”}]
。请检查我问题中的更新2。