AEM:从java中的节点读取一个值,该值是多字段的值

AEM:从java中的节点读取一个值,该值是多字段的值,java,content-management-system,aem,Java,Content Management System,Aem,我正在用java阅读一组节点。每个节点都属于一个国家。每个节点都有属性“country”,对于像我们这样的一些国家,也有属性“states”节点。此“状态”是多字段的一部分,因此每个项目都有一个状态,这些状态都集中在一个节点中,类似于: country = "US" , states = [{"statename":"District of Columbia"}, {"statename":"Rhode Island"},{"statename":"South Dakota"}] 我希望通过如

我正在用java阅读一组节点。每个节点都属于一个国家。每个节点都有属性“country”,对于像我们这样的一些国家,也有属性“states”节点。此“状态”是多字段的一部分,因此每个项目都有一个状态,这些状态都集中在一个节点中,类似于:

country = "US"
, states = [{"statename":"District of Columbia"}, {"statename":"Rhode Island"},{"statename":"South Dakota"}]
我希望通过如下servlet调用将它们作为json填充到页面中:

以下是我的代码:

while (nodeItr.hasNext()) {
                    Node cNode = nodeItr.nextNode();
                    if (cNode.hasProperty("country")) {
                        JSONObject jsonData = new JSONObject();
                        jsonData.put("country", childNode.getProperty("countryname").getValue().getString());
                        jsonArray.put(jsonData);
                        if (cNode.hasProperty("states")) {
// This should display array of all states as an when it is encountered.
LOG.info(childNode.getProperty("states").getValue().getString());
发生以下情况: 1.我得到了所有的国家名单,除了第一个国家的财产是出口。 2.不会显示statelist所在的其他国家/地区

我做错了什么?

请尝试以下操作:

if (cNode.hasProperty("states")) {
    Property statesProperty = cNode.getProperty("states");
    if (statesProperty.isMultiple()) {
        Value[] statesValues = states.getValues();
        for (Value stateValue : stateValues) {
            LOG.info(stateValue.getString());
        }
    }
}
请尝试以下操作:

if (cNode.hasProperty("states")) {
    Property statesProperty = cNode.getProperty("states");
    if (statesProperty.isMultiple()) {
        Value[] statesValues = states.getValues();
        for (Value stateValue : stateValues) {
            LOG.info(stateValue.getString());
        }
    }
}

Node是您的自定义类,如果是,请提供它的代码;所以我试图理解,你是否能够通过节点读取所有数据(我指的是所有国家及其对应的州),而无法将其写入JSON格式。或者你甚至不能读取它?我可以读取所有未通过多字段填充的国家,但是在同一节点上,nevel“states”通过多字段值填充。因此,它在crxde中的节点中存储为字符串数组:country type(string)India states:type(string[]){statename:“德里”,statename:“旁遮普”,statename:“哈里亚纳”}然后下一个节点,对于没有州的国家,它们没有“州”属性So,它在遇到第一个拥有它的国家时检查该州的if条件,打印它,从不检查下一个国家的州。此外,随后将国家作为财产的所有国家也被省略。我认为我在读取字符串数组的属性时出错了。Node是您的自定义类吗?如果是,请提供它的代码。Node是javax.jcr.Node类;所以我试图理解,你是否能够通过节点读取所有数据(我指的是所有国家及其对应的州),而无法将其写入JSON格式。或者你甚至不能读取它?我可以读取所有未通过多字段填充的国家,但是在同一节点上,nevel“states”通过多字段值填充。因此,它在crxde中的节点中存储为字符串数组:country type(string)India states:type(string[]){statename:“德里”,statename:“旁遮普”,statename:“哈里亚纳”}然后下一个节点,对于没有州的国家,它们没有“州”属性So,它在遇到第一个拥有它的国家时检查该州的if条件,打印它,从不检查下一个国家的州。此外,随后将国家作为财产的所有国家也被省略。我认为我在读取字符串数组的属性时出错了。您是否也可以回答这个问题:我想提醒大家使用org.apache.sling.api.resource.resource,org.apache.sling.api.resource.ValueMap接口,而不是低级的javax.jcr.Node,javax.jcr.property。它们更易于使用,不会引发异常,并导致更简单、更可维护的代码。您是否也可以回答这个问题:我想提醒大家,使用org.apache.sling.api.resource.resource、org.apache.sling.api.resource.ValueMap接口,而不是低级的javax.jcr.Node、javax.jcr.Property。它们更易于使用,不抛出异常,并且生成更简单、更可维护的代码。