[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt JSON API via Javascript ins InDesign CS5

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

JSON API via Javascript ins InDesign CS5

fabiantheblind
Beiträge gesamt:

18. Nov 2010, 01:09
Beitrag # 1 von 7
Bewertung:
(10579 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hello Skriptwerkstätter,

für ein Projekt bin ich dabei ein API auszulesen und habe folgendes Probleme wo ich nicht mehr weiterkomme.
Ich habe diese Skripte:

Code
#include "./meta/GetURLs_fnctn_CS5.jsx"; 
#include "./meta/json2.js";


function main(){


dies ist die URL von der die JSON Daten kommen. Dies funktioniert auch im Browser und auch mit processing.org / Java
leider kann ich die nicht öffentlich machen da die API noch experimentell ist.

Code
var url = "www.meine-db-url.de/usw/usw/"; 


die function GetURL kommt aus diesem Skript
http://www.indesignscript.de/...amp;cHash=4d4135beb7

dieses skript funktioniert unter CS5 wenn man die in den Kommentaren vermerkten Änderungen vornimmt.
http://rorohiko.blogspot.com/2008_07_01_archive.html

Code
var incomDataRaw = GetURL(key,true); 


die Funktionen JSON.stringify() und JSON.parse()
habe ich von hier
http://goessner.net/download/prj/jsonxml/
Code
var myJsonObject = JSON.stringify(incomDataRaw); 

var myparsedObj = JSON.parse(myJsonObject);

alert(myparsedObj.toSource());

}
main();


in meinem alert(myparsedObj.toSource());
kommen aber immer noch folgende "Metadaten?" mit :

Code
({status:"HTTP/1.1 200 OK", headers:{Date:"Wed, 17 Nov 2010 23:27:51 GMT", Server:"Apache/2.2.8 (Linux/SUSE)", "X-Powered-By":"PHP/5.2.12", (…und so weiter…)}, body:"102e6 


und erst nach body beginnt das JSON element, welches ich wirklich brauche und was auch in Java und im Browser ankommt. Ebenfalls schliesst dieses Element nach "meinem" Element wieder.

wenn ich das Ganze nicht

Code
toSource() 

ausgebe. Bekomme ich von InDesign
Code
[object Object] 

zurück. Das klingt ja eigentlich ganz gut. Leider weiss ich nicht wie ich hier weiterkomme. Alles was ich im Web gefunden habe, wie z.B.
Code
myparsedObj.projects[0] 

(projects wäre das folgende JSON element) funktioniert nicht.

Ich habe leider noch gar keine Erfahrungen im Umgang mit Json machen können noch mit InDesign und Webanfragen.

Kann mir jemand den Anstoss in die richtige Richtung geben um da weiter zu kommen? Oder vielleicht einen Link zu einem JSON tutorial welches auch auf InDesign anwendbar ist.

Das wäre super.

:F

Hier nochmals der code in einem Stück:

Code
#include "./meta/GetURLs_fnctn_CS5.jsx"; 
#include "./meta/json2.js";
function main(){
var URL = "";// hier meine url

var incomDataRaw = GetURL(key,true);

var myJsonObject = JSON.stringify(incomDataRaw);

var myparsedObj = JSON.parse(myJsonObject);

alert(myparsedObj.toSource()); // gibt ne menge Junk zurück
alert(myparsedObj); // gibt [object Object] zurück

main();




Und hier der beginn meiner JSON elemente (aus meiner Javakonsole)
Code
{"projects":[{"id":"189","files":[{"text":"Dies ist ein Titel ,"preview":"http://url.de/openfile/","filename":"vorschau.pdf","src":"http://url.de/myfile.pdf","type":"file"},{"text":"noch etwas mehr text"","preview":"http://url.de","src":"http://url.de","type":"file"} 

X

JSON API via Javascript ins InDesign CS5

fabiantheblind
Beiträge gesamt:

18. Nov 2010, 13:48
Beitrag # 2 von 7
Beitrag ID: #457364
Bewertung:
(10541 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ fabiantheblind ]
die Funktionen JSON.stringify() und JSON.parse()
habe ich von hier
http://goessner.net/download/prj/jsonxml/


Diese url ist falsch. Richtig ist:
http://www.json.org/json2.js


als Antwort auf: [#457305]

JSON API via Javascript ins InDesign CS5

fabiantheblind
Beiträge gesamt:

19. Nov 2010, 09:44
Beitrag # 3 von 7
Beitrag ID: #457482
Bewertung:
(10508 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Okay, Hilf dir selbst :)
Ich bin einen Schritt weiter und bin jetzt bei einem neuen Problem angelangt.
Um JSON besser zu verstehen habe ich mal ein eigenes JSON Objekt erzeugt. Da funktioniert das Aufrufen aller Inhalte super.
Um den ganzen http Kram loszuwerden hat ein einfaches
Code
.body 

gereicht.

Nun versuche ich die Daten in wirklich JSON Objekte zu parsen und habe das Problem, daß ich den String nicht in Objekte wandeln kann. Wenn ich die Funktion JSON.parse verwenden bekomme ich einen Javascript Fehler. Er behauptet dann es würde eine "(" fehlen.
hier mein Code soweit.
Im Anhang ein screenshot des alert der im code aufgerufen wird.
Und einmal der Fehler der kommt wenn ich JSON.parse verwende(Was nciht zu empfehlen ist da dann ID sich aufhängt).

Vll hat ja jemand eine Idee:

Code
// sry but this API isn't public yet 
// thats why we need the magic
#include "./keys/theMagic.jsx";
#include "./meta/GetURLs_fnctn_CS5.jsx";
//#include "./meta/json.js";
#include "./meta/json2.js";
#include "./meta/json2xml.js"
function main(){

// a basic json object

var basicJSONObj = { "db_01" : [ // db is an array in basicJSONObj.
{ "firstElement" : "Monkeys öüä", // First element
"lastElement" : "typing",
"someValue" : 5 },

{ "firstElement" : "Mice", // Second Element
"lastElement" : "ruling the world",
"someValue" : 32 }
], // End "accounting" array.
"db_02" : [ // db_02 is another array in basicJSONObj.
{ "firstElement" : "Cells", // First Element
"lastElement" : "thinking",
"someValue" : 23 },

{ "firstElement" : "Lights", // Second Element
"lastElement" : "blinking",
"someValue" : 42 }
] // End db_02 Array.
} // End basicJSONObj


var key = "";
try{
var key = theMagic(true);
//alert(key);
} catch (e){
alert("Sry no key found");
exit();
}

// GetURL is from here: http://preview.tinyurl.com/26xl6xq
var incomDataRaw = GetURL(key,false);

alert("incom: "+ incomDataRaw.body);


//alert("basicJSONObj: "+ basicJSONObj);

}

main();



als Antwort auf: [#457364]
(Dieser Beitrag wurde von fabiantheblind am 19. Nov 2010, 09:51 geändert)

Anhang:
screenshotAlertJson.jpg (268 KB)   Bildschirmfoto 2010-11-19 um 09.49.33.JPG (79.2 KB)

JSON API via Javascript ins InDesign CS5

Gerald Singelmann
  
Beiträge gesamt: 6268

19. Nov 2010, 12:20
Beitrag # 4 von 7
Beitrag ID: #457515
Bewertung:
(10490 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Okay, Hilf dir selbst

Anlässlich dieses anscheinend gutgelaunten Vorwurfs paraphrasiere ich mal, was ich von der ersten Mail verstanden habe:

Hallo ich habe ein Problem, das nicht eigentlich was mit InDesign zu tun hat und verwende dazu eine API, die keiner kennt und die ich auch nicht zeigen darf, aber irgendwas funktioniert nicht...


Ein kurzer Blick über den Rest der Mail ließ vermuten, dass es mich mindestens eine halbe Stunde kosten würde, auch nur zu verstehen, worum es geht, ohne schon etwas für eine Lösungsfindung erreicht zu haben, welcher wahrscheinlich gar nicht möglich ist, da mir ja nicht alle Resourcen zur Verfügung stehen.

Ich persönlich brach also nach dem ersten Absatz die Lektüre ab.

Nur eine Vermutung: vielleicht gibts mehr Hilfe, wenn die Fragen präziser gestellt sind und nicht einen Tag Arbeit vom anderen erwarten?
Also nicht "Ich verstehe JSON nicht" sondern z.B. "Ich habe <da><dort>huch</dort></da> als XML-Struktur. Wie drücke ich das in JSON aus?"


als Antwort auf: [#457482]

JSON API via Javascript ins InDesign CS5

Marc Sidon
Beiträge gesamt: 262

19. Nov 2010, 12:44
Beitrag # 5 von 7
Beitrag ID: #457522
Bewertung:
(10482 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Gerald Singelmann ] Also nicht "Ich verstehe JSON nicht" sondern z.B. "Ich habe <da><dort>huch</dort></da> als XML-Struktur. Wie drücke ich das in JSON aus?"


Herrlich... :)

Gruß,
Marc


als Antwort auf: [#457515]

JSON API via Javascript ins InDesign CS5

Marc Sidon
Beiträge gesamt: 262

19. Nov 2010, 13:00
Beitrag # 6 von 7
Beitrag ID: #457528
Bewertung:
(10474 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Fabian,

wie verwendest Du denn JSON.parse?
Wendest Du es auf Dein "basicJSONObj" an?
Also JSON.parse(basicJSONObj) ???

Wenn ich JSON bislang richtig verstanden habe, muß Dein basicJSONObj ein String sein!

Also:
Code
var basicJSONObj = '{ "db_01" : [{ "firstElement" : "Monkeys öüä", "lastElement" : "typing", "someValue" : 5 }, { "firstElement" : "Mice", "lastElement" : "ruling the world", "someValue" : 32 } ], "db_02" : [ { "firstElement" : "Cells", "lastElement" : "thinking", "someValue" : 23 }, { "firstElement" : "Lights","lastElement" : "blinking", "someValue" : 42 } ]}'; 

JSON.parse(basicJSONObj);


Gruß,
Marc


als Antwort auf: [#457482]

JSON API via Javascript ins InDesign CS5

fabiantheblind
Beiträge gesamt:

19. Nov 2010, 13:53
Beitrag # 7 von 7
Beitrag ID: #457537
Bewertung:
(10453 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hello,

@ Gerald: Das "hilf dir selbst" sollte kein Vorwurf sein. Sry wenn das falsch ankam.
Und ja. Der erste Post war etwas wirr :) (nachts um 0100)

Es passiert gerade folgendes.

Ich benutze diesen Parser https://github.com/...blob/master/json2.js so:
Code
var basicJSONString = "{ \"db_01\":[{\"firstElement\" : \"Monkeys\",  \"lastElement\"  : \"typing\", \"someValue\"       : 5 },{ \"firstElement\" : \"Mice\",\"lastElement\"  : \"ruling the world\", \"someValue\": 32 } ],  \"db_02\": [ { \"firstElement\" : \"Cells\",  \"lastElement\"  : \"thinking\", \"someValue\"       : 23 }, { \"firstElement\" : \"Lights\",  \"lastElement\"  : \"blinking\",  \"someValue\"       : 42 }]}"; 

var JSONObj = JSON.parse(basicJSONString);
alert(JSONObj);


Wenn ich selber einen JSONString in meinem Script erzeuge (wie im Codeblock oben) funktioniert das auch und ich habe ein JSONObject das ich weiter benutzen kann.
Wenn ich diese function auf den String der aus der (ultrageheimen :) ) API kommt anwende kriege ich leider Probleme. Egal welchen JSON Parser ich verwende es kommt immer die Meldung die auf dem einem Screenshot zu sehen ist. http://www.hilfdirselbst.ch/...ent;postatt_id=5155;

Der String der ankommt kann jedoch in Java/Processing "geparsed" werden. Was eher darauf hinweisst das es mein Fehler innerhalb des Scriptes ist oder ID die Menge an Daten nicht zwischenspeichern kann (der String hat über 66000 Zeichen und wird bestimmt noch länger sobald das Projekt wirklich läuft).

Ich denke es liegt entweder an der Datenmenge oder vielleicht an der function GetURL aus dem script GetURLs.js
http://www.indesignscript.de/...amp;cHash=4d4135beb7
Oder an etwas völlig anderem. Leider verstehe ich das GetURLs script so gut wie gar nicht und kann deswegen da auch nicht eingreifen.

Was mich ein bisschen wundert ist, dass die Fehlermeldung auf "…/XHTML for Digital Editions…" verweisst.

Hm hab ich jetzt irgendeine Frage gestellt?
Nicht wirklich.

Ein paar Fragen wären:

-Die Function
Code
GetURL("http://www.url.de",isBinary) 

kann binäre Daten und UTF-8. Die API spuckt UTF-8 aus. Also liege ich richtig da auch UTF-8 anzugeben bei der Variable: isBinary false
Oder ist der JSON Output UTF-8 und die Anfrage an die API könnte trotzdem Binär sein?

- In JSON werden Sonderzeichen in zB \u00c8 == é umgewandelt kann es sein das so etwas mit der Function GetURLs Probleme erzeugt?
Oder Übernimmt die GetURL nur das verarbeiten der Anfrage und zurück kommt ein String?
(Für mich sieht es so aus als ob "nur" ein String zurück kommt.)


- Was hat das XHTML for Digital Editions usw mit dem ganzen zu tun?

- Und zuletzt: Hat irgendjemand bereits versuche unternommen direkt Daten aus dem Netz zu laden ausser dem Autor von GetURLs.js?

Ich danke euch für eure Mühen und werde versuchen in Zukunft richtige Fragen zu stellen, verständliche Posts zu schreiben und früh ins Bett zu gehen.

:F

Ein Nachtrag. Ich habe folgendes gefunden und werde es so bald wie möglich ausprobieren. Vielleicht klappt das dann ja. Ich halte euch auf dem laufendem:

Extendables is an MIT-licensed developers’ framework for Adobe ExtendScript. If you’re writing heavy-duty automations for a Creative Suite app like InDesign, or anything more than just a throwaway script, this is for you.

Extendables comes with three big blocks of functionality.

1. Additional methods on built-in objects like String and Array that give you the Javascript 1.8 features you’re used to (think forEach), conveniences for functional programming (think map, reduce, filter), easy serialization to base64 and more.
2. Additional methods on InDesign DOM objects that make coding in InDesign less verbose.
3. Packages for logging, unit testing, http requests, user interface development, and a couple of other goodies.

http://extendables.org/docs/#

Und das ganze in Anwendung:
http://www.indiscripts.com/...-script-for-indesign


als Antwort auf: [#457528]
(Dieser Beitrag wurde von fabiantheblind am 19. Nov 2010, 14:13 geändert)
X