Java 将JSON记录转换为LinkedHashMap<;字符串,字符串>;使用jacksonapi

Java 将JSON记录转换为LinkedHashMap<;字符串,字符串>;使用jacksonapi,java,json,jackson,objectmapper,Java,Json,Jackson,Objectmapper,我有一个JSON文件(它包含一个JSON对象数组) 我试着一个接一个地读它。 我需要将每个对象转换为LinkedHashMap,其中键和值都是字符串。请注意,即使JSON对象包含非字符串值(Integer/Boolean),我也希望我的LinkedHashMap包含字符串 这是我的JSON文件(films.JSON): 现在,这有一个对象。我想将其转换为LinkedHashMap 因此,对于上面的示例,我的LinkedHashMap应该包含(对于第一个JSON对象): “名称”:“搏击俱乐部”

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

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

现在,这有一个对象。我想将其转换为
LinkedHashMap

因此,对于上面的示例,我的
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);
}
Map myLinkedHashMap;
JsonParser JsonParser=new JsonFactory().createParser(新文件(“films.json”);
jsonParser=newjsonfactory().createParser(新文件(filePath));
jsonParser.nextToken();
ObjectMapper mapper=新的ObjectMapper();
registerModule(新的JavaTimeModule());
禁用(反序列化功能。在未知属性上失败);
while(jsonParser.nextToken()!=JsonToken.END_数组){
myLinkedHashMap=mapper.readValue(jsonParser,LinkedHashMap.class);
}
变量
myLinkedHashMap
将包含JSON文件中对象的键/值对

但问题是,对于JSON文件的“年”,我在LinkedHashMap中得到整数,因为JSON文件也包含整数

相反,我希望
LinkedHashMap
中的
Integer
作为
String

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

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


因此,如果JSON对象包含布尔值
true
,那么我的
LinkedHashMap
应该包含
“true”

,您可以使用
TypeFactory
constructMapType
方法构造映射类型,以准确地告诉您需要从
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() + ")");
            });
        }
    }
}
改变

Map<String, Object> myLinkedHashMap;
Map myLinkedHashMap;

Map myLinkedHashMap;

为什么不在使用值时调用
toString
toString
将返回
String
@Deadpool。代码紧密耦合,无法进行更改。如果可以定义自定义类,则可以执行此操作
name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)
Map<String, Object> myLinkedHashMap;
 Map<String, String> myLinkedHashMap;