转换JSON记录到LinkedHashMap的<字符串,字符串>使用杰克逊API

宙斯 :

我有一个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”

请注意,这一年是如何StringLinkedHashMapInteger

这是我试过了。

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文件中获取整数还包含整数。

相反,我希望IntegerStringLinkedHashMap

请帮我拿StringLinkedHashMap不是Integer

注:该解决方案应该是通用的其他数据类型也。

因此,如果JSON对象包含布尔true,那么我LinkedHashMap应该包含"true"

迈克尔Ziober:

您可以通过构建地图类型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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

杰克逊将字符串转换为对象

杰克逊解析字符串字段作为JSON

杰克逊ObjectCodec字符串json

JSON-使用杰克逊库解析无效的终止字符串

使用杰克逊将Java对象转换为json字符串时重复的json属性

如何在Java中使用杰克逊将输入字符串转换为JSON字符串或JSON对象

杰克逊转换java对象元属性作为任选在JSON字符串

杰克逊日期格式问题:Java bean到JSON字符串转换

杰克逊从json字符串转换为Java对象导致默认对象

如何使用杰克逊将布尔值以字符串形式序列化为JSON到JSON

杰克逊不能转换为空字符串值,以枚举

映射一个JSON字符串与杰克逊对象将抛出MismatchedInputException

杰克逊(Jackson)反序列化变量为杰森(Json)字符串

Java; 杰克逊 解析数组json字符串的数组

如何在杰克逊的JsonNode中解析JSON字符串?

杰克逊对象映射器未从Java对象创建正确的Json字符串

杰克逊(Jackson)令牌流的JSON(> 1 gig)中的长字符串

地图字符串使用杰克逊继承对象

在杰克逊中将一个字段从字符串更改为json对象

杰克逊读值作为字符串

杰克逊JsonNode字符串与排序键

如何通过杰克逊进行字符串验证?

API调用的字符串转换

使用 bash 转换字符串

使用XSLT转换字符串

自定义日期字符串使用杰克逊JsonFormat模式

反序列化使用杰克逊的字符串或对象

使用JSON从字符串解析数组?

使用 EMFJson 读取 JSON 字符串