使用 Jackson API 将 JSON 记录转换为 LinkedHashMap<String,String>
Convert JSON record to LinkedHashMap<String,String> using Jackson API
我有一个 JSON 文件(它包含一个 JSON 对象数组。)
我试图逐个对象地读取它。
我需要将每个对象转换为 LinkedHashMap<String,String>
,其中键和值都是字符串。请注意,即使 JSON 对象包含一个非字符串值 (Integer/Boolean
),我也希望我的 LinkedHashMap
包含一个字符串。
这是我的 JSON 文件 (films.json
):
[
{
"name": "Fight Club",
"year": 1999,
}
]
现在,这有 1 个对象。我想将其转换为 LinkedHashMap<String,String>
.
所以对于上面的例子,我的 LinkedHashMap
应该包含(对于第一个 JSON 对象):
"name" : "Fight CLub"
"year" : "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 文件中对象的 key/value 对。
But the problem is that for 'year' of the JSON file, I am getting Integer in the LinkedHashMap as the JSON file also contains Integer.
相反,我希望 Integer
作为 LinkedHashMap
中的 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() + ")");
});
}
}
}
以上代码打印:
name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)
改变
Map<String, Object> myLinkedHashMap;
到
Map<String, String> myLinkedHashMap;
我有一个 JSON 文件(它包含一个 JSON 对象数组。)
我试图逐个对象地读取它。
我需要将每个对象转换为 LinkedHashMap<String,String>
,其中键和值都是字符串。请注意,即使 JSON 对象包含一个非字符串值 (Integer/Boolean
),我也希望我的 LinkedHashMap
包含一个字符串。
这是我的 JSON 文件 (films.json
):
[
{
"name": "Fight Club",
"year": 1999,
}
]
现在,这有 1 个对象。我想将其转换为 LinkedHashMap<String,String>
.
所以对于上面的例子,我的 LinkedHashMap
应该包含(对于第一个 JSON 对象):
"name" : "Fight CLub"
"year" : "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 文件中对象的 key/value 对。
But the problem is that for 'year' of the JSON file, I am getting Integer in the LinkedHashMap as the JSON file also contains Integer.
相反,我希望 Integer
作为 LinkedHashMap
中的 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() + ")");
});
}
}
}
以上代码打印:
name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)
改变
Map<String, Object> myLinkedHashMap;
到
Map<String, String> myLinkedHashMap;