【问题标题】:Use Jackson to parse and unnamed array使用 Jackson 解析和未命名数组
【发布时间】:2014-03-06 18:28:11
【问题描述】:

好的,所以我正在使用 Jackson 来解析 JSON 文件,问题是,该文件是一个未命名的大数组。格式为:

[ {json stuff}, {json stuff}, ..., {json stuff} ]

所有json stuff 只是常规的 JSON 表达式,一旦我将它实际放入数组中,我将不得不处理它们。

我找不到任何关于如何使用 Jackson 映射事物的真正教程,但需要找到一种方法将这些不同事物中的每一个映射到一个数组中,然后使用 Jackson 将每个特定事物解析为它的各个组件。知道怎么做吗?

附:我能找到的唯一真正的教程是:http://www.studytrails.com/java/json/java-jackson-Data-Binding.jsp

其中 DataSet[] 是在文件中命名的数组。我想弄清楚该教程的作用,除了上面的示例,数组不是以名称开头的。

附言这是我正在使用的代码:

映射到我的项目的基本 Jackson 代码:

ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    URL url = null;
    try {
        url = new URL("my JSON URL");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    try {
        ContactInfo contacts = mapper.readValue(url, ContactInfo.class);
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

然后我的 ContactInfo 类只是在 JSON URL 中具有定义字段的 Getter 和 Setter。问题是,如果没有分解所有不同 JSON 节点的数组名称,我不知道如何访问单个联系人值,或者它们是否被覆盖。

【问题讨论】:

  • 只需使用List<Whatever>Whatever[]
  • 你有任何代码可以发布你迄今为止尝试过的内容吗?
  • 刚刚添加。编辑:使用 List 会导致类型不匹配,与 ContactInto[] 相同。
  • 澄清一下,请求返回到 URL 的 JSON 数组包含一组映射到 ContactInfo pojos 的 JSON 对象?
  • 正确,它是一个未命名的 JSON 对象数组,我试图将其映射到 ContactInfo 对象中。我在 ContactInfo 中定义了所有字段,除了我仍在尝试处理的字段,但除此之外,它是一个包含 JSON 对象的未命名数组。

标签: java json jackson


【解决方案1】:

只需使用ContactInfo[] 作为类类型。这是一个工作示例。

public class Example {
    public static void main(String[] args) throws Exception {
        String json = "[{\"name\":\"random\"},{\"name\":\"random\"},{\"name\":\"random\"}]";
        ObjectMapper mapper = new ObjectMapper();
        ContactInfo[] contactInfos = mapper.readValue(json, ContactInfo[].class);
        System.out.println(contactInfos.length);
    }

    static class ContactInfo {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    } 
}

或者,您可以使用List<ContactInfo>,但您需要TypeReference

List<ContactInfo> contactInfos = mapper.readValue(json, new TypeReference<List<ContactInfo>>() {});
System.out.println(contactInfos.size());

【讨论】:

  • 明白了,还在学习杰克逊,今天才开始,那里严重缺乏教程。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多