2016-04-14 39 views
0

搜索索引的查询使用JSON文件输出我跟着样品类动物在https://github.com/cloudant/java-cloudant/blob/88202a1bd7b9b04d96c4b7b8498a1b8f7f99c9e5/src/test/java/com/cloudant/tests/Animal.java如何建立一流的管理cloudant

我成功地管理搜索索引查询这个类。我想,我有JSON格式的文档在cloudant为:

{ 
    "_id": "web", 
    "_rev": "11-b1d0e315272a87c2549df4004d836049", 
    "min_weight": 40, 
    "max_weight": 65, 
    "min_length": 1, 
    "max_length": 2.2, 
    "attributeCollection": { 
    "attributeArray": [ 
     { 
     "updateable": false, 
     "lookup": "issuetype", 
     "issueAttributeDefinitionId": 13, 
     "attributeType": 1, 
     "name": "web issue", 
     "value": [ 
      "Improper Neutralization of Input During Web Page Generation" 
     ] 
     } 
    ] 
    }, 
} 

我的问题是如何建立一个Java类来管理此文档的搜索索引输出。特别是,如何管理设置的属性根据您过去的几年堆栈溢出帖“attributeCollection”,“attributeArray” ......“名称”,“值”

+0

您与列出的字段创建一个属性类。在你的Animal类中,你将拥有一个Attribute对象列表。 –

+0

@吉尔伯特我做到了,但它的工作。它可以解决“_id”,“_rev”,“min_weght”,但它显示“attributeCollection”等错误。 –

+0

我不明白。您的JSON解析器**是否自动**创建Java对象,或者您在将JSON解析器的输出映射到您手动创建的Java对象**时遇到问题**? –

回答

2

的,我认为你有两个选择:

1)如果你定义issue类正如你在以前的帖子确实可以执行不同的Java中搜索到刚刚返回这些领域中的问题类,如下所示:

SearchResult<issue> issues=db.search("attributes/by_name_value") 
    .limit(10).includeDocs(false) 
    .querySearchResult("name:\"web*\"", issue.class); 

for (int i = 0; i < issues.getRows().size(); i++) { 
    SearchResult<issue>.SearchResultRow row = issues.getRows().get(i); 
    System.out.println(row.getId()); 
    System.out.println(row.getFields().getName());    
    System.out.println(row.getFields().getValue()); 
} 

注:该电话querySearchResult而不是queryinclude_docs是错误的。

2)如果您需要返回整个文档,那么您需要创建与您的JSON匹配的类。你的类应该是这个样子:

Issue2

public class Issue2 { 

    private String id; 
    private Integer min_weight; 
    // TODO: other fields 
    private AttributeCollection attributeCollection; 

    public Issue2() { 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Integer getMin_weight() { 
     return min_weight; 
    } 

    public void setMin_weight(Integer min_weight) { 
     this.min_weight = min_weight; 
    } 

    public AttributeCollection getAttributeCollection() { 
     return attributeCollection; 
    } 

    public void setAttributeCollection(AttributeCollection attributeCollection) { 
     this.attributeCollection = attributeCollection; 
    } 

}

AttributeCollection

public class AttributeCollection { 

    private Attribute[] attributeArray; 

    public Attribute[] getAttributeArray() { 
     return attributeArray; 
    } 

    public void setAttributeArray(Attribute[] attributeArray) { 
     this.attributeArray = attributeArray; 
    } 
} 

属性

public class Attribute { 

    private String name; 
    private String value[]; 
    // TODO: other fields 

    public String getName() { 
     return name; 
    } 

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

    public String[] getValue() { 
     return value; 
    } 

    public void setValue(String[] value) { 
     this.value = value; 
    } 
} 

然后你可以使用以前的搜索调用(与Issue2类):

List<Issue2> issues=db.search("attributes/by_name_value") 
    .limit(10).includeDocs(true) 
    .query("name:\"web*\"", Issue2.class); 

for (int i = 0; i < issues.size(); i++) { 
    Issue2 row = issues.get(i); 
    System.out.println("min_weight = " + row.getMin_weight()); 
    if (row.getAttributeCollection() != null && row.getAttributeCollection().getAttributeArray() != null) { 
     for (int j=0; j<row.getAttributeCollection().getAttributeArray().length; j++) { 
      String name = row.getAttributeCollection().getAttributeArray()[i].getName(); 
      String[] values = row.getAttributeCollection().getAttributeArray()[i].getValue(); 
      System.out.println(name); 
      if (values != null) { 
       for(String value: values) { 
        System.out.println(value); 
       } 
      } 
     } 
    } 
} 
+0

太棒了!谢谢。我仍然想问你“搜索查询索引的输出是不是JSON的权利?” –

+0

Cloudant的输出是JSON,但是java驱动程序会将该JSON转换为Java类的实例。这就是为什么你的Java类必须匹配你的JSON结构。 – markwatsonatx

+0

我添加了min_weight作为如何添加其他字段的示例。 – markwatsonatx