如何将HashMap序列化为ArrayList作为JSON?

时间:2014-12-27 11:54:19

标签: java json arraylist hashmap jackson

我的模型有HashMap,如下所示:

private Map<String, String>     attrMap     = new HashMap<String, String>();

并将其初始化为:

attrMap.add("name", "value of name");
attrMap.add("content", "value of content");

但我希望将此字段序列化为ArrayList这样的对象:

[{name: "value of name"}, {content: "value of content"}]

更新1

有没有办法在序列化期间调用函数,如下所示:

@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());
}

更新2

我使用此类序列化attrMap,但出现can not start an object expecting field name错误。

import java.io.IOException;
import java.util.Map;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

public class AttrMapSerializer extends JsonSerializer<Map<String, String>> {

        @Override
        public void serialize(Map<String, String> attributes, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
            for (Map.Entry<String, String> attribute : attributes.entrySet())
            {
                generator.writeStartObject();
                generator.writeObjectField("name", attribute.getKey());
                generator.writeObjectField("content", attribute.getValue());
                generator.writeEndObject();
            }
        }
    }

我是Jackson

的初学者

3 个答案:

答案 0 :(得分:1)

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

@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"}]
}

它使用来自ObjectNode的{​​{1}}类和一些Java 8流的组合来收集新数据。

编辑:在他们要求采用其他方法的OP的更多信息后,我添加了此替代方案。

另一种方法是在属性上使用Jackson

@JacksonSerializer

这样序列化外部化为序列化器,POJO完好无损。

答案 1 :(得分:0)

尝试使用keySet和值方法返回一组键和值,然后转换为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"}]

请注意:由于地图中没有添加方法,因此您的帖子中似乎有拼写错误。希望你的意思是放,而不是添加。还有像Gson,jackson等实用程序可以转换为json对象。

答案 2 :(得分:0)

如果您不介意手动操作,请使用以下代码(未经过测试,但应该可以使用):

ArrayList<String> entries = new ArrayList<>(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());

这可能是最简单的方法,因为如果你想使用JSON库,你必须修改输出(不推荐,因为它强加了不良的可维护性),或者为HashMap编写自定义序列化器/反序列化器,这会更复杂。