JSON Encoder und Decoder
Re: JSON Encoder und Decoder
Hallo PMV, erstmal danke für deinen En/Decoder.
Ich habe jedoch noch ein Problem. Es handelt sich um folgende Abfrage, die JSON zurückgibt:
http://de.wikipedia.org/w/api.php?actio ... xl2/Archiv (nicht wundern, was das für eine Seite ist, ich bin durch Zufall drauf gekommen).
Jedenfalls gibt JSON_decode #false zurück. An der Stringgröße kanns nicht liegen, eine ähnlich große Seite
wurde ohne Probleme ausgewertet. Ich habe also die Vermutung, dass in der Abfrage irgendwelche Zeichen
vorhanden sind, die den Decoder durcheinander bringen. Ich hab jetzt schon gesucht, welche das sein könnten,
habe aber kein Ergebnis bekommen.
Vielleicht weißt du oder jemand anderes, was der Grund für den Rückgabewert ist.
Ich habe jedoch noch ein Problem. Es handelt sich um folgende Abfrage, die JSON zurückgibt:
http://de.wikipedia.org/w/api.php?actio ... xl2/Archiv (nicht wundern, was das für eine Seite ist, ich bin durch Zufall drauf gekommen).
Jedenfalls gibt JSON_decode #false zurück. An der Stringgröße kanns nicht liegen, eine ähnlich große Seite
wurde ohne Probleme ausgewertet. Ich habe also die Vermutung, dass in der Abfrage irgendwelche Zeichen
vorhanden sind, die den Decoder durcheinander bringen. Ich hab jetzt schon gesucht, welche das sein könnten,
habe aber kein Ergebnis bekommen.
Vielleicht weißt du oder jemand anderes, was der Grund für den Rückgabewert ist.
Win11 x64 | PB 6.20
Re: JSON Encoder und Decoder
a²+b²=mc²
Re: JSON Encoder und Decoder
ich würde auf irgendwelche Rechts-Links-Steuerzeichen oder so einen Kram
tippen, bloß kenn ich mich mit damit überhaupt nicht aus. Die ganzen UTF-8-Zeichen
wie \u00f6 wandel ich vorher um.
tippen, bloß kenn ich mich mit damit überhaupt nicht aus. Die ganzen UTF-8-Zeichen
wie \u00f6 wandel ich vorher um.
Win11 x64 | PB 6.20
Re: JSON Encoder und Decoder
Im englischen Forum wurden bereits 2 Fehler gemeldet und auch die Korrekturen gepostet.
Sorry das ich die noch nicht übernommen hab, aber aktuell ist nicht viel mit PB. Wann
genau ich da wieder zu komme weis ich aber auch noch nicht, deswegen kann ich
nur hoffen das es nix dringendes ist
In diesem Quartal gehts aber definitiv wieder weiter, nur jetzt gerade ist schlecht.
Wenn du warten willst, ich werd's mir bei Zeit anschauen und danke für die Info.
MFG PMV
Sorry das ich die noch nicht übernommen hab, aber aktuell ist nicht viel mit PB. Wann
genau ich da wieder zu komme weis ich aber auch noch nicht, deswegen kann ich
nur hoffen das es nix dringendes ist

In diesem Quartal gehts aber definitiv wieder weiter, nur jetzt gerade ist schlecht.

Wenn du warten willst, ich werd's mir bei Zeit anschauen und danke für die Info.

MFG PMV
Re: JSON Encoder und Decoder
Ok, danke, dass du da dranbleibst. Wie sehr das mich jetzt stört
kann ich noch nicht sagen, kommt darauf an, wie viele Seiten ich
noch finde, bei denen er nichts ausspuckt. Zur Not kann ich immer
noch auf XML umsteigen.
Mal schauen, ich mach erst mal an einer anderen Stelle weiter.
kann ich noch nicht sagen, kommt darauf an, wie viele Seiten ich
noch finde, bei denen er nichts ausspuckt. Zur Not kann ich immer
noch auf XML umsteigen.
Mal schauen, ich mach erst mal an einer anderen Stelle weiter.

Win11 x64 | PB 6.20
Re: JSON Encoder und Decoder
@Andesdaf: ich habs jetzt grade ausprobiert. Der Code von PMV parst das JSON problemlos.
Grüße ... Kiffi
Grüße ... Kiffi
a²+b²=mc²
Re: JSON Encoder und Decoder
dann liegts wohl an mir... hier mein Code:
Wer findet den Fehler? 
Code: Alles auswählen
XIncludeFile "PBWB_JSON.pbi"
EnableExplicit
Procedure.s PBWB_JSDecoder(psString.s)
Protected iPos.i
Protected sZeichen.s
Protected sZeichen1.s
Protected sZeichenNeu.s
Protected sUnicode.s
psString = ReplaceString(psString, "\n", Chr(13) + Chr(10))
sUnicode = Space(4)
Repeat
iPos = FindString(psString,"\u")
If iPos <> 0
sZeichen = Mid(psString, iPos, 6)
sZeichen1 = ReplaceString(sZeichen, "\u", "$")
PokeI(@sUnicode,Val(sZeichen1))
sZeichenNeu = PeekS(@sUnicode)
psString = ReplaceString(psString, sZeichen, sZeichenNeu, #PB_String_NoCase, iPos, 1)
EndIf
Until iPos = 0
psString = ReplaceString(psString, "\/", "/")
psString = ReplaceString(psString, "\" + Chr(34), Chr(34))
ProcedureReturn psString
EndProcedure
Procedure.s PBWB_SendHTTPGet(URL$, TimeOut=10000)
Protected Event, Time, Size, String$
Protected BufferSize = $10000000
Protected *Buffer = AllocateMemory(BufferSize)
Protected *Buffer2 = AllocateMemory(BufferSize)
Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site)
Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)
Protected header.s
Protected Inhalt.i
If ConnectionID
header + "GET "+URL$+" HTTP/1.0"+#CRLF$
;header + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + #CRLF$
header + "User-Agent: PureBasic WikiBotFramework - User:InkoBot" + #CRLF$
header + "Host: Seite" + #CRLF$
header + "Accept-Charset: UTF-8" + #CRLF$
;header + "Content-Type: application/x-www-form-urlencoded" + #CRLF$
;header + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + #CRLF$
;header + "Accept-Encoding: gzip" + #CRLF$
header + "Cache-Control: no-cache" + #CRLF$
header + "Cookie: keep-alive" + #CRLF$ + #CRLF$
SendNetworkString(ConnectionID,header)
Time = ElapsedMilliseconds()
Repeat
Delay(10)
Event = NetworkClientEvent(ConnectionID)
Until Event Or ElapsedMilliseconds()-Time > TimeOut
If Event
Repeat
Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
String$ + PeekS(*Buffer, Size, #PB_UTF8)
Until Not Size
Size = Len(String$) * 2
ReAllocateMemory(*Buffer2,Size)
PokeS(*Buffer2, String$, Size, #PB_Ascii)
String$ = PeekS(*Buffer2, Size, #PB_Ascii)
Inhalt = FindString(String$, #LFCR$, 1)
FreeMemory(*Buffer)
FreeMemory(*Buffer2)
If Inhalt
ProcedureReturn Mid(String$,Inhalt+3)
Else
ProcedureReturn String$
EndIf
EndIf
EndIf
EndProcedure
Procedure.s PBWB_GetPageContent(psDomain.s, psPagename.s)
Protected sResult.s
Protected sResult2.s
Protected sText.s
Protected sPageID.s
Protected *out.jsonObj
sResult2 = PBWB_SendHTTPGet("http://" + psDomain + "/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=" + URLEncoder(psPagename))
sResult = PBWB_JSDecoder(sResult2)
*out = JSON_decode(sResult)
If *out
sPageID = MapKey(*out\o("query")\o("pages")\o())
sText.s = *out\o("query")\o("pages")\o(sPageID)\o("revisions")\a(0)\o("*")\s
JSON_free(*out)
Else
Debug "[ERROR] could not read JSON output"
EndIf
ProcedureReturn sText
EndProcedure
If InitNetwork()
Debug PBWB_GetPageContent("de.wikipedia.org", "Benutzer Diskussion:Maxxl2/Archiv")
EndIf

Win11 x64 | PB 6.20
Re: JSON Encoder und Decoder
liegt wohl an Deinem PBWB_JSDecoder(). Wenn ich den
auskommentiere, bekomme ich keinen Fehler.
Grüße ... Kiffi
auskommentiere, bekomme ich keinen Fehler.
Grüße ... Kiffi
a²+b²=mc²
Re: JSON Encoder und Decoder
danke, jetzt wo du es sagst... ich hatte es vorher schon mal ohne probiert, doch
da schien es nicht zu gehen.
Ich guck nochmal nach. Ganz sauber ist dieser JSdecoder sicher auch nicht.
da schien es nicht zu gehen.
Ich guck nochmal nach. Ganz sauber ist dieser JSdecoder sicher auch nicht.
Win11 x64 | PB 6.20
Re: JSON Encoder und Decoder
update 19.04.2013
+ bugfix: Unicode escaped Zeichen (\u) wurden fehlerhaft ausgelesen
+ bugfix: Map-Keys wurden nicht JSON-Komform espaced
+ verbessert: Escapen von Strings in JSON_encode() beschleunigt
+ verbessert: Testcode nun mit CompilerIf #IsMain anstelle ihn immer aus zu kommentieren
So lang mir keiner Fehler aufzeigt ist meiner Fehlerfrei.
Ich nutz ihn zudem ja auch selber. Und sollte wer Fehler finden,
werden die auch sobald ich Zeit finde korrigiert.
+ bugfix: Unicode escaped Zeichen (\u) wurden fehlerhaft ausgelesen
+ bugfix: Map-Keys wurden nicht JSON-Komform espaced
+ verbessert: Escapen von Strings in JSON_encode() beschleunigt
+ verbessert: Testcode nun mit CompilerIf #IsMain anstelle ihn immer aus zu kommentieren
So lang mir keiner Fehler aufzeigt ist meiner Fehlerfrei.

Ich nutz ihn zudem ja auch selber. Und sollte wer Fehler finden,
werden die auch sobald ich Zeit finde korrigiert.
