Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[java] CouchDB und JSON synchronisation [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[java] CouchDB und JSON synchronisation


 
PHP_Pan
28-07-2010, 16:30 
 
Hallo,

ich habe schon alles versucht und viel ausprobiert komme aber auf keinen
grünen Zweig ... jetzt hoffe ich das mir hier jemand evtl. mit einer oder auch
mehreren Ideen und / oder Tipps helfen kann.

Ich habe mir eine CouchDB installiert und diese auch schon im Einsatz.

Ich kann Documents im JSON Format in der DB ablegen und auch auslesen...
soweit so gut.

Jetzt mein Problem: Ich möchte in der DB immer in der neuesten Revision die
kompletten Daten halten d.h. ich muss wenn ich Daten ablegen bzw. hinzu-
fügen möchte:
1.) JSON Document aus der Datenbank laden (die aktuelle rev.)
2.) Ein neues JSON File mit ergänzenden bzw. zu ändernden Daten laden
-------- jetzt beginnt das Problem ------
3.) Ich laufe rekursiv die JSON Struktur des Originals durch und vergleiche
die Werte mit dem neuen JSON und möchte die Daten natürlich ergänzen.

Und ... das bekomme ich nicht hin, ich benutze jcouchdb API mit svenson mein
Problem sind die verzweigungen von (Bei Java) Map / ArrayList und Strings bzw.
sind nur die Arrays ein Problem da ich dort keinen Key habe der die Werte ein-
deutig identifiziert.

Ich hoffe ihr könnt mein Problem wenigstens etwas nachvollziehen.

Hat wer eine Idee wie ich zwei JSON Dateien vernünftig mergen kann um diese
dann als ein neues Doc komplett in meiner CouchDb abzuspeichern?

Vielen Dank euch

 
AmicaNoctis
28-07-2010, 16:46 
 
Hallo,

*move* ins richtige Unterforum und markiert als java. (Wenn das nicht stimmt, bitte melden. Das nächste Mal bitte dazuschreiben, worum es geht.)

JSON-Arrays werden doch als java.util.List geparst, also kannst du doch z. B. einfach über
list.get(3);
das vierte Element davon ansprechen.

Evtl. hilft dir auch der svenson TypeMapper (http://code.google.com/p/svenson/wiki/ParsingJSON#Type_Mapper) weiter, um ein bestimmtes Objekt im Array zu finden.

Gruß,

Amica

 
PHP_Pan
28-07-2010, 17:06 
 
Danke für die Antwort und den Link,
das hatte ich auch schon angeschaut ist aber nicht das richtige
für mein Problem.

Ich möchte eigentlich einfach zwei JSON Strings / Files / Objekte egal
in welcher Form zu einem Ergebniss d.h. einem JSON irgendwas zusammen-
fügen, dabei ist es mir relativ egal wie das vonstatten gehen kann ich habe es mit
Java versucht mit Rekursion aber bekomme das nicht hin.
Solange nur Maps und Strings da sind (im JSON) geht das aber die Arrays bzw.
Listen dadrin bekomme ich nicht vernünftig abgeglichen.

Evtl hab ich auch nur einen gedanklichen Hänger und brauche nur einen Anstoss in die richtige Richtung :)

Das hier ist mein Ansatz gewesen aber ich steh auf dem Schlauch ;(

public void compare(String key, Object object){
if(object instanceof Map<?,?>){
Map<String, Object> newObject = (Map<String, Object>) object;
Depth tiefe = new Depth(key, 'M');
depth.add(tiefe);
this.compareMap(newObject);
}
else if(object instanceof ArrayList<?>){
ArrayList<Object> newObject = (ArrayList<Object>) object;
Depth tiefe = new Depth(key, 'A');
depth.add(tiefe);
this.compareArrayList(newObject);
}
else if(object instanceof String){
String newObject = (String) object;
this.compareString(newObject);
}
}

public void compareMap(Map<String, Object> map){
for (Map.Entry<String, Object> entry : map.entrySet()){
compare(entry.getKey(), entry.getValue());
}
}

public void compareArrayList(ArrayList<Object> array){
Iterator<Object> listIterator = array.iterator();
while(listIterator.hasNext()){
compare("ARRAY", listIterator.next());
}
}

public void compareString(String string){
Object container = resultMap;
Iterator<Depth> depthIterator = depth.iterator();
while(depthIterator.hasNext()){
Depth actuallDepth = depthIterator.next();

if(container instanceof Map<?,?>){
Map<String,Object> realContainer = (Map<String,Object>)container;
if(!(realContainer.containsKey(actuallDepth.getKey()) && actuallDepth.getKey() == "ARRAY")){
if(actuallDepth.getType() == 'M'){
Map<String, Object> newMap = new HashMap<String, Object>();
realContainer.put(actuallDepth.getKey(), newMap);
container = newMap;
}
else if(actuallDepth.getType() == 'A'){
ArrayList<Object> newArray = new ArrayList<Object>();
realContainer.put(actuallDepth.getKey(), newArray);
container = newArray;
}
}
}
else if(container instanceof ArrayList<?>){
ArrayList<Object> realContainer = (ArrayList<Object>)container;
if(realContainer.){

}

}

} // end of while
} // end of method compareString

 
AmicaNoctis
28-07-2010, 17:09 
 
Ich kann den Code irgendwie nicht nachvollziehen. Normalerweise erwartet man ja von einer Vergleichsmethode irgendeinen Rückgabewert.

Warum arbeitest du mit dem Pseudoschlüssel „ARRAY“ statt irgendetwas à la i++ zu verwenden? Dass du dann deine Arrayelemente nicht mehr wiederfinden kannst, ist kein Wunder ;)

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:48 Uhr.