【问题标题】:Convert JSON record to LinkedHashMap<String,String> using Jackson API使用 Jackson API 将 JSON 记录转换为 LinkedHashMap<String,String>
【发布时间】:2019-11-05 20:07:13
【问题描述】:

我有一个 JSON 文件(它包含一个 JSON 对象数组。) 我正在尝试逐个对象地阅读它。 我需要将每个对象转换为LinkedHashMap&lt;String,String&gt;,其中键和值都是字符串。请注意,即使 JSON 对象包含非字符串值 (Integer/Boolean),我也希望我的 LinkedHashMap 包含字符串。

这是我的 JSON 文件 (films.json):

[
  {
    "name": "Fight Club",
    "year": 1999,
  }
]

现在,这有 1 个对象。我想将其转换为LinkedHashMap&lt;String,String&gt;

所以对于上面的例子,我的LinkedHashMap 应该包含(对于第一个 JSON 对象):

“名称”:“战斗俱乐部”

“年”:“1999”

注意LinkedHashMap 中的年份是String 而不是Integer

这是我尝试过的。

Map<String, Object> myLinkedHashMap;

JsonParser jsonParser = new JsonFactory().createParser(new File("films.json"));
jsonParser = new JsonFactory().createParser(new File(filePath));
jsonParser.nextToken();

ObjectMapper  mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

while(jsonParser.nextToken() != JsonToken.END_ARRAY){
    myLinkedHashMap  = mapper.readValue(jsonParser, LinkedHashMap.class);
}

变量 myLinkedHashMap 将包含我的 JSON 文件中对象的键/值对。

但问题是,对于 JSON 文件的“年份”,我在 LinkedHashMap 中获取 Integer,因为 JSON 文件也包含 Integer。

相反,我希望 IntegerLinkedHashMap 中作为 String

请帮我在LinkedHashMap 中获取String 而不是Integer

注意:该解决方案也应该适用于其他数据类型。

所以如果 JSON 对象包含布尔值 true,那么我的 LinkedHashMap 应该包含 "true"

【问题讨论】:

  • 为什么不在使用时调用toStringtoString 将返回String
  • @Deadpool 代码是紧密耦合的,不能在那里进行更改
  • 如果你可以定义自定义类,你可以这样做

标签: java json jackson objectmapper


【解决方案1】:

您可以使用TypeFactoryconstructMapType 方法构造地图类型,以准确地告诉您从readValue 方法中需要什么。见下例:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.util.Assert;

import java.io.File;
import java.util.LinkedHashMap;

public class JsonMapApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        JsonParser jsonParser = mapper.getFactory().createParser(jsonFile);
        jsonParser.nextToken();

        MapType mapType = mapper.getTypeFactory().constructMapType(LinkedHashMap.class, String.class, String.class);
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
            LinkedHashMap<String, String> map = mapper.readValue(jsonParser, mapType);
            map.forEach((k, v) -> {
                Assert.isInstanceOf(String.class, v);
                System.out.println(k + " -> " + v + " (" + v.getClass().getName() + ")");
            });
        }
    }
}

上面的代码打印:

name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)

【讨论】:

    【解决方案2】:

    改变

    Map<String, Object> myLinkedHashMap;
    

     Map<String, String> myLinkedHashMap;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多