JSON Encoder und Decoder

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON Encoder und Decoder

Beitrag von Andesdaf »

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.
Win11 x64 | PB 6.20
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

mh, JSONLint (http://jsonlint.com) meint zumindest, dass es valides JSON ist...

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON Encoder und Decoder

Beitrag von Andesdaf »

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.
Win11 x64 | PB 6.20
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

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. :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON Encoder und Decoder

Beitrag von Andesdaf »

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. :)
Win11 x64 | PB 6.20
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

@Andesdaf: ich habs jetzt grade ausprobiert. Der Code von PMV parst das JSON problemlos.

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON Encoder und Decoder

Beitrag von Andesdaf »

dann liegts wohl an mir... hier mein Code:

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

Wer findet den Fehler? :(
Win11 x64 | PB 6.20
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON Encoder und Decoder

Beitrag von Kiffi »

liegt wohl an Deinem PBWB_JSDecoder(). Wenn ich den
auskommentiere, bekomme ich keinen Fehler.

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON Encoder und Decoder

Beitrag von Andesdaf »

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.
Win11 x64 | PB 6.20
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: JSON Encoder und Decoder

Beitrag von PMV »

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. :mrgreen:
Ich nutz ihn zudem ja auch selber. Und sollte wer Fehler finden,
werden die auch sobald ich Zeit finde korrigiert. :wink:
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten