2016-04-14 4 views
0

ich die Tierprobe Klasse bei https://github.com/cloudant/java-cloudant/blob/88202a1bd7b9b04d96c4b7b8498a1b8f7f99c9e5/src/test/java/com/cloudant/tests/Animal.javaWie Klasse baut die Ausgabe der Suchindex Abfrage mit JSON-Dokument in cloudant

I Suchindex Abfrage von dieser Klasse nicht gelungen, gefolgt zu verwalten. Ich nehme an, dass ich ein Dokument mit JSON-Format in cloudant habe wie:

{ 
    "_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" 
     ] 
     } 
    ] 
    }, 
} 

Meine Frage ist, wie eine Java-Klasse bauen den Suchindex Ausgabe für diese Dokumente zu verwalten. Insbesondere, wie als „Attribut“, „attributeArray“, ... „name“, „Wert“

+0

Sie eine Attribut-Klasse mit den angegebenen Feldern erstellen. In Ihrer Animal-Klasse haben Sie eine Liste von Attributobjekten. –

+0

@Gilbert Ich habe es getan, aber es funktioniert. Es kann nach "_id", "_rev", "min_weght", .. lösen, aber es zeigt Fehler in "attributeCollection" und so weiter. –

+0

Ich verstehe nicht. Ist Ihr JSON-Parser ** automatisch ** in der Lage, Java-Objekte zu erstellen, oder haben Sie Probleme beim Zuordnen der Ausgabe Ihres JSON-Parsers zu Java-Objekten **, die Sie manuell erstellt haben **? –

Antwort

2

basierend auf den letzten Stack Overflow Beiträge Satz von Attributen zu verwalten glaube ich Ihnen ein paar Möglichkeiten:

1) Wenn Sie Ihre issue Klasse definieren, wie Sie in Ihrer früheren Post haben Sie eine andere Art der Suche in Java ausführen können nur die Felder in Ihrer Ausgabe Klasse zurückgeben wie folgt:

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()); 
} 

Hinweis: ruft querySearchResult anstelle von query und include_docs ist falsch.

2) Wenn Sie das gesamte Dokument zurückgeben müssen, müssen Sie Klassen erstellen, die Ihrem JSON entsprechen. Ihre Klassen sollte wie folgt aussehen:

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; 
    } 

}

Attribute

public class AttributeCollection { 

    private Attribute[] attributeArray; 

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

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

Attribut

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; 
    } 
} 

Dann können Sie den vorherigen Suchaufruf (mit Issue2 Klasse) verwenden:

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

Das ist so toll! Danke. Ich möchte Sie immer noch fragen "die Ausgabe des Suchabfrage-Index ist nicht JSON richtig?" –

+0

Die Ausgabe von Cloudant ist JSON, aber der Java-Treiber konvertiert diesen JSON in Instanzen Ihrer Java-Klassen. Aus diesem Grund müssen Ihre Java-Klassen Ihrer JSON-Struktur entsprechen. – markwatsonatx

+0

Ich habe min_weight als Beispiel hinzugefügt, wie Sie Ihre anderen Felder hinzufügen können. – markwatsonatx