Java 使用Jackson解析JSON节点内的JSON节点

Java 使用Jackson解析JSON节点内的JSON节点,java,json,jackson,Java,Json,Jackson,我是Jackson库的新手,正在尝试解析JSON文件中的一个节点,该文件中有其他节点,例如,它看起来如下: { "node1": "value1", "node2": "value2", "node3": { "innerNode1": "value1", "innerNode2": "value2" } } 我想做的是在一个类中定义整个节点,然后让node3成为它自己的独立类,就像用Jackson解析的常规Java对象

我是Jackson库的新手,正在尝试解析JSON文件中的一个节点,该文件中有其他节点,例如,它看起来如下:

{ "node1": "value1",
  "node2": "value2",
  "node3": {
           "innerNode1": "value1",
           "innerNode2": "value2"
           }
}
我想做的是在一个类中定义整个节点,然后让node3成为它自己的独立类,就像用Jackson解析的常规Java对象一样,因此它具有所有相同的setter和getter方法。因此,我希望能够调用
masterNode.getNode1
并让它输出
value1
,但也能够调用
node3.getInnerNode1
并让它输出
value1

我不知道这样的事情会怎么做,任何帮助都将不胜感激

编辑:以下是我正在使用的代码:

protected void onPostExecute(ContactInfo[] result) {
        int length = result.length;
        ArrayList<ContactInfo> contacts = new ArrayList<ContactInfo>();
        ArrayList<String> names = new ArrayList<String>();
        ArrayList<PhoneNumber> numberMap = new ArrayList<PhoneNumber>();
        ArrayList<String> workNumber = new ArrayList<String>();

        for (int i = 0; i < length; i++) {
            contacts.add(result[i]);
        }

        for (int i = 0; i < length; i++) {
            names.add(contacts.get(i).getName());
        }

        for (int i = 0; i < length; i++) {
            numberMap.add(contacts.get(i).getPhoneNumber());
        }

        for(PhoneNumber num: numberMap) {
            workNumber.add(num.getWork());
        }

        adapter = new ArrayAdapter<String>(local, R.layout.list_item, R.id.contactName, workNumber);

        setListAdapter(adapter);
    }
}代码:

public static class ContactInfo {
    private String name;
    private PhoneNumber phoneNumber;

    public String getName() {
        return name;
    }

    public PhoneNumber getPhoneNumber() {
        return phoneNumber;
    }

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

    public void setPhoneNumber(PhoneNumber phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

public static class PhoneNumber {
    private String work;

    public String getWork() {
        return work;
    }

    public void setWork(String work) {
        this.work = work;
    }
}

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {

    // POJO
    ContactInfo info1 = new ContactInfo();
    info1.setName("Neel1");
    PhoneNumber num = new PhoneNumber();
    num.setWork("123 456 7890");
    info1.setPhoneNumber(num);

    String json = new ObjectMapper().defaultPrettyPrintingWriter().writeValueAsString(info1);
    System.out.println(json);

    // From JSON
    String info2Json = "{ \"name\" : \"Neel2\", \"phoneNumber\" : { \"work\" : \"098 765 4321\" } }";
    ContactInfo info2 = new ObjectMapper().readValue(info2Json, ContactInfo.class);

    doSomething(new ContactInfo[] { info1, info2 });
}

private static void doSomething(ContactInfo[] result) {
    for(ContactInfo each : result) {
        String name = each.getName();
        String workPhone = each.getPhoneNumber().getWork();
        doSomething(name, workPhone);
    }

}

private static void doSomething(String name, String workPhone) {
    System.out.println("name: " + name + ", work: " + workPhone);
}
输出:

{
  "name" : "Neel1",
  "phoneNumber" : {
    "work" : "123 456 7890"
  }
}
name: Neel1, work: 123 456 7890
name: Neel2, work: 098 765 4321

只需创建嵌套的POJO。JSON的根是你的根Pojo,它依赖于一个
node3
Pojo。如果属性没有对齐,你可能需要一个。我不认为这不是因为它们没有对齐,而是因为它没有认识到像node3这样的东西有它自己的类被归属于它,所以我无法访问像innerNode1这样的值。我最近在这里回答了一个非常类似的问题:向我们展示您的尝试。这非常好地映射到一个
RootNode
,其中包含2个
String
字段、
node1
node2
以及第三个
NestedNode
字段,名为
node3
NestedNode
类将有两个
String
字段
innerNode1
innerNode2
。检查上面的代码,我的类设置与您的完全相同,我试图抓取项而不是编写它们,但我认为类设置应该基本相同。num.getWork()是否可能返回null?否,我只是再次检查了所有这些,因为我使用Eclipse自动生成getter和setter,因为有很多。但它确实返回字段“work”,该字段应映射到工作编号。所以我猜它从来没有真正进入并设置这些变量等于任何东西。你能发布你已经发布的ContactInfo类吗?刚刚发布了,很长,但正如我所说,我没有看到任何问题,应该给我一个问题。
{
  "name" : "Neel1",
  "phoneNumber" : {
    "work" : "123 456 7890"
  }
}
name: Neel1, work: 123 456 7890
name: Neel2, work: 098 765 4321