我有一个JSON文件(它包含JSON对象的数组)。我想读它由Object对象。每个对象我需要将其转换为LinkedHashMap<String,String>
其中键和值都是字符串。请注意,即使JSON对象包含非字符串值(Integer/Boolean
),我想我LinkedHashMap
要包含一个字符串。
这是我的JSON文件(films.json
):
[
{
"name": "Fight Club",
"year": 1999,
}
]
现在,这个拥有1个对象。我想将其转换为一个LinkedHashMap<String,String>
。
因此,对于上面的例子中,我LinkedHashMap
应该包含(对于第一个JSON对象):
“名”:“搏击俱乐部”
“年”: “1999”
请注意,这一年是如何String
在LinkedHashMap
不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中的JSON文件中获取整数还包含整数。
相反,我希望Integer
为String
在LinkedHashMap
。
请帮我拿String
的LinkedHashMap
不是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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句