当前位置: 首页 > 知识库问答 >
问题:

使用Jackson 2.0解析JSON对象数组

许阿苏
2023-03-14

我正在将Jackson从1.9.4升级到2.2.0。过渡非常顺利,只是我似乎无法对对象进行数组解析。在1.9.4中,我可以这样做:

private List<Subjects> mSubjects;
mSubjects = objectMapper.readValue(subjectsJsonArrayNode, new TypeReference<List<Subjects>>() {});

在Jackson 2.2.0中,我得到了一个“无法解析方法”编译时错误。Jackson 1.9.4的ObjectMapper头文件包含以下JsonNodes的readValue方法:

public <T> T readValue(JsonNode root, java.lang.Class<T> valueType)
public <T> T readValue(JsonNode root, org.codehaus.jackson.type.TypeReference valueTypeRef)
public <T> T readValue(JsonNode root, org.codehaus.jackson.type.JavaType valueType)

和Jackson 2.2.0的头文件:

public <T> T readValue(JsonParser jsonParser, java.lang.Class<T> tClass)
public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.TypeReference<?> typeReference)
public final <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.ResolvedType resolvedType)
public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.databind.JavaType javaType) 

所以我需要从传递JsonNode切换到JsonParser,但我不太确定如何进行这种转换。也就是说,我甚至不确定我是否走对了路,因为JsonParser被定义为一个抽象类,所以我甚至不能轻松地初始化一个实例来使用它。

对于那些没有答案的人,我有一个临时的解决方案,我迭代并手动解析每个对象:

 private List<Subjects> mSubjects = new ArrayList<Subjects>();
 for(JsonNode subjectJsonNode : subjectsJsonArrayNode) {
    mSubjects.add(objectMapper.treeToValue(subjectJsonNode, Subject.class));
 }

共有2个答案

马凡
2023-03-14

我对列表使用此方法:

/**
 * Returns a list collection of any specified type
 * @param jsonValue the json string content to deserialize
 * @param type the type to serialize into
 * @return a list of specified type
 */
public List<?> readJSONToList(String jsonValue,Class<?> type){

    List<?> objDTOS=null;
    try {
        //get json content without root name
        JsonNode root= objectMapper.readTree(jsonValue).get(getRootName());
        TypeFactory tf = objectMapper.getTypeFactory();
        JavaType listOfObjs = tf.constructCollectionType(ArrayList.class,type);
        objDTOS=objectMapper.readValue(root.traverse(), listOfObjs);

    } catch (NullPointerException e) {
        Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
    } catch (JsonParseException e) {    
        Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
    } catch (IOException e) {
        Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR);
    }
    return  objDTOS;
}
邢华清
2023-03-14

您可以简单地调用JsonNode.traverse()方法来获取JsonParser

通过以下简单示例进行测试:

public class App {

    public static class Foo {
        public int foo;
    }

    public static void main(String[] args) {

        String json = "{\"someArray\":[{\"foo\":5},{\"foo\":6},{\"foo\":7}]}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(json);
        node = node.get("someArray");
        TypeReference<List<Foo>> typeRef = new TypeReference<List<Foo>>(){};
        List<Foo> list = mapper.readValue(node.traverse(), typeRef);
        for (Foo f : list) {
            System.out.println(f.foo);
        }
    }
}

产出:

5
6
7

 类似资料:
  • 问题内容: 我有一个JSON,它可以是单个对象或相同对象的数组。有没有一种方法可以使用Gson解析此数据,从而区分单个对象还是数组? 我目前唯一的解决方案是手动解析json并用try catch包围它。首先,我将尝试将其解析为单个对象,如果失败,它将引发异常,然后尝试将其解析为数组。 我不想手动解析它……那将使我永远。这是正在发生的事情的想法。 这是可以是数组或单个对象的对象。 然后在与json响

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片

  • 问题内容: 我有一个包含对象的json数组的文件: [{“ test1”:“ abc”},{“ test2”:[1,2,3]}] 我希望使用Jackson的JsonParser来从此文件中获取输入流,并且在每次调用.next()时,我希望它从数组中返回一个对象,直到用完对象或失败为止。 这可能吗? 用例:我有一个带有json数组的大文件,其中填充有大量具有不同架构的对象。我想一次获得一个对象,以避

  • 服务器JSON数据显示在活动中使用改造。JSON数据通过gson转换。 给错误:"java.lang.IllegalState异常:预期BEGIN_ARRAY但BEGIN_OBJECT在第1行第2列路径$" JSON格式: 代码: 主要活动。kt

  • 问题内容: 我无法理解如何使用Visual .NET将JSON字符串解析为c#对象。任务很简单,但是我仍然迷路…我得到了这个字符串: 这是我尝试进行消毒的代码: 我不知道在’<’和’>’之间放置什么,从网上阅读的内容中,我必须为其创建一个新的类。另外,如何获得输出?一个例子会有所帮助! 问题答案: 创建一个可以反序列化您的JSON的新类,例如:

  • } 我在公共类中的主要方法是这样的: 以下是包裹的代码: } 但是我似乎没有找到正确的方法来将变量的所有值存储在列表中。现在我得到的只是parcel[data=null]。