January 15, 2021, 05:54:39 PM

Author Topic: [bmx] tiny JSON reader/writer by Warpy [ 1+ years ago ]  (Read 739 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] tiny JSON reader/writer by Warpy [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : tiny JSON reader/writer
Author : Warpy
Posted : 1+ years ago

Description : from <a href="http://www.json.org/" target="_blank">http://www.json.org[/url] :
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.
This is a tiny JSON library I wrote in about an hour and a half. Amazingly, it worked first time!


Code :
Code: BlitzMax
  1. Type jsondecoder
  2.         Field txt$
  3.         Field i
  4.         Field curchr$
  5.         Field things:TList
  6.        
  7.         Method New()
  8.                 things=New TList
  9.         End Method
  10.  
  11.         Method getnext(tokens$[],onlywhitespace=1)
  12.                 oldi=i
  13.                 While i<Len(txt)
  14.                         c$=Chr(txt[i])
  15.                         i:+1
  16.                         For token$=EachIn tokens
  17.                                 If c=token
  18.                                         curchr=c
  19.                                         Return 1
  20.                                 EndIf
  21.                         Next
  22.                         If onlywhitespace And (Not (c=" " Or c="~t" Or c="~n" Or c="~r"))
  23.                                 i:-1
  24.                                 Return 0
  25.                         EndIf
  26.                 Wend
  27.                 i=oldi
  28.                 Return 0
  29.         End Method
  30.        
  31.         Function Create:jsondecoder(txt$)
  32.                 j:jsondecoder=New jsondecoder
  33.                 j.txt=txt
  34.                 j.i=i
  35.                 Return j
  36.         End Function
  37.        
  38.         Method parse()
  39.                 While getnext(["{","["])
  40.                         Select curchr
  41.                         Case "{" 'new object
  42.                                 o:jsonobject=parseobject()
  43.                                 If Not o
  44.                                         Print "error - couldn't parse object"
  45.                                 EndIf
  46.                                 things.addlast o
  47.                         Case "[" 'new array
  48.                                 a:jsonarray=parsearray()
  49.                                 If Not a
  50.                                         Print "error - couldn't parse array"
  51.                                 EndIf
  52.                                 things.addlast a
  53.                         End Select
  54.                 Wend
  55.         End Method     
  56.        
  57.         Method parseobject:jsonobject()
  58.                 o:jsonobject=New jsonobject
  59.                 While getnext(["~q","}"])
  60.                         Select curchr
  61.                         Case "~q"
  62.                                 p:jsonpair=parsepair()
  63.                                 If Not p
  64.                                         Print "error reading pair"
  65.                                 EndIf
  66.                                 o.pairs.addlast p
  67.                                 If Not getnext([",","}"])
  68.                                         Print "error after reading pair - expected either , or }"
  69.                                 EndIf
  70.                                 If curchr="}"
  71.                                         Return o
  72.                                 EndIf
  73.                         Case "}"
  74.                                 Return o
  75.                         End Select
  76.                 Wend
  77.                
  78.                 Print "error reading Object - expected a } at least!"
  79.         End Method
  80.        
  81.         Method parsepair:jsonpair()
  82.                 p:jsonpair=New jsonpair
  83.                 p.name=parsestring()
  84.                 If Not getnext([":"])
  85.                         Print "error reading pair - expected a :"
  86.                 EndIf
  87.                 v:jsonvalue=parsevalue()
  88.                 If Not v
  89.                         Print "error reading pair - couldn't read a value"
  90.                 EndIf
  91.                 p.value=v
  92.                 Return p
  93.         End Method
  94.        
  95.         Method parsearray:jsonarray()
  96.                 a:jsonarray=New jsonarray
  97.                 While getnext(["~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n","]"])
  98.                         Select curchr
  99.                         Case "~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n"
  100.                                 i:-1
  101.                                 v:jsonvalue=parsevalue()
  102.                                 a.values.addlast v
  103.                                 If Not getnext([",","]"])
  104.                                         Print "error - expecting , or ]"
  105.                                 EndIf
  106.                                 If curchr="]"
  107.                                         Return a
  108.                                 EndIf
  109.                                
  110.                         Case "]"
  111.                                 Return a
  112.                         End Select
  113.                 Wend
  114.                 Print "error - expecting a value or ]"
  115.         End Method
  116.        
  117.         Method parsestring$()
  118.                 oldi=i
  119.                 s$=""
  120.                
  121.                 While getnext(["~q",""],0)
  122.                         s:+txt[oldi..i-1]
  123.                         Select curchr
  124.                         Case "~q"
  125.                                 Return s
  126.                         Case ""
  127.                                 Select Chr(txt[i])
  128.                                 Case "~q"
  129.                                         s:+"~q"
  130.                                 Case ""
  131.                                         s:+""
  132.                                 Case "/"
  133.                                         s:+"/"
  134.                                 Case "b"
  135.                                         s:+Chr(8)
  136.                                 Case "f"
  137.                                         s:+Chr(12)
  138.                                 Case "n"
  139.                                         s:+"~n"
  140.                                 Case "r"
  141.                                         s:+"~r"
  142.                                 Case "t"
  143.                                         s:+"~t"
  144.                                 Case "u"
  145.                                         s:+parseunicode()
  146.                                 End Select
  147.                                 i:+1
  148.                         End Select
  149.                         oldi=i
  150.                 Wend
  151.         End Method
  152.        
  153.         Method parseunicode$()
  154.                 n:Short=0
  155.                 For t=1 To 4
  156.                         n:*16
  157.                         c=txt[i+t]
  158.                         If c>48 And c<57
  159.                                 n:+c-48
  160.                         ElseIf c>=65 And c<=70
  161.                                 n:+c-55
  162.                         ElseIf c>=97 And c<=102
  163.                                 n:+c-87
  164.                         EndIf
  165.                 Next
  166.                 i:+4
  167.                 Return Chr(n)
  168.         End Method
  169.        
  170.         Method parsevalue:jsonvalue()
  171.                 If Not getnext(["~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n"])
  172.                         Print "error - expecting the beginning of a value"
  173.                 EndIf
  174.                 Select curchr
  175.                 Case "~q"
  176.                         s$=parsestring()
  177.                         Return jsonstringvalue.Create(s,0)
  178.                 Case "-","0","1","2","3","4","5","6","7","8","9"
  179.                         n:Double=parsenumber()
  180.                         Return jsonnumbervalue.Create(n)
  181.                 Case "{"
  182.                         o:jsonobject=parseobject()
  183.                         Return o
  184.                 Case "["
  185.                         a:jsonarray=parsearray()
  186.                         Return a
  187.                 Case "t"
  188.                         i:+3
  189.                         Return jsonliteralvalue.Create(1)
  190.                 Case "f"
  191.                         i:+4
  192.                         Return jsonliteralvalue.Create(0)
  193.                 Case "n"
  194.                         i:+2
  195.                         Return jsonliteralvalue.Create(-1)
  196.                 End Select
  197.         End Method
  198.        
  199.         Method parsenumber:Double()
  200.                 i:-1
  201.                 sign=1
  202.                 n:Double=0
  203.                 Select Chr(txt[i])
  204.                 Case "-"
  205.                         i:+2
  206.                         Return parsenumber()*(-1)
  207.                 Case "0"
  208.                         i:+1
  209.                         If getnext(["."])
  210.                                 n=parsefraction()
  211.                         EndIf
  212.                 Case "1","2","3","4","5","6","7","8","9"
  213.                         n=parseinteger()
  214.                         If getnext(["."])
  215.                                 n:+parsefraction()
  216.                         EndIf
  217.                 End Select
  218.                
  219.                 If Chr(txt[i])="e" Or Chr(txt[i])="E"
  220.                         i:+1
  221.                         Select Chr(txt[i])
  222.                         Case "+"
  223.                                 sign=1
  224.                         Case "-"
  225.                                 sign=-1
  226.                         Default
  227.                                 Print "error - not a + or - when reading exponent in number"
  228.                         End Select
  229.                         e=parseinteger()
  230.                         n:*10^(sign*e)
  231.                 EndIf
  232.                 Print "parsed number "+String(n)
  233.                 Return n
  234.         End Method
  235.                        
  236.         Method parsefraction:Double()
  237.                 digits=0
  238.                 n:Double=0
  239.                 While txt[i]>=48 And txt[i]<=57 And i<Len(txt)
  240.                         n:*10
  241.                         n:+txt[i]-48
  242.                         i:+1
  243.                         digits:+1
  244.                 Wend
  245.                 n:/(10^digits)
  246.                 If i=Len(txt)
  247.                         Print "error - reached EOF while reading number"
  248.                 EndIf
  249.                 Print "parsed fraction "+String(n)
  250.                 Return n
  251.         End Method
  252.        
  253.         Method parseinteger:Double()
  254.                 n:Double=0
  255.                 While txt[i]>=48 And txt[i]<=57 And i<Len(txt)
  256.                         n:*10
  257.                         n:+txt[i]-48
  258.                         i:+1
  259.                 Wend
  260.                 If i=Len(txt)
  261.                         Print "error - reached EOF while reading number"
  262.                 EndIf
  263.                 Print "parsed integer "+String(n)
  264.                 Return n
  265.         End Method
  266.                        
  267. End Type
  268.  
  269. Type jsonvalue
  270.  
  271.         Method repr$(tabs$="")
  272.                 Return tabs
  273.         End Method
  274. End Type
  275.  
  276. Type jsonobject Extends jsonvalue
  277.         Field pairs:TList
  278.  
  279.         Method New()
  280.                 pairs=New TList
  281.         End Method
  282.        
  283.         Method addnewpair(txt$,value:jsonvalue)
  284.                 pairs.addlast jsonpair.Create(txt,value)
  285.         End Method
  286.        
  287.         Method repr$(tabs$="")
  288.                 t$="{"
  289.                 ntabs$=tabs+"~t"
  290.                 op:jsonpair=Null
  291.                 For p:jsonpair=EachIn pairs
  292.                         If op Then t:+","
  293.                         t:+"~n"+ntabs+p.repr(ntabs)
  294.                         op=p
  295.                 Next
  296.                 t:+"~n"+tabs+"}"
  297.                 Return t
  298.         End Method
  299.        
  300.         Method getvalue:jsonvalue(name$)
  301.                 For p:jsonpair=EachIn pairs
  302.                         If p.name=name
  303.                                 Return p.value
  304.                         EndIf
  305.                 Next
  306.         End Method
  307.        
  308.         Method getstringvalue$(name$)
  309.                 v:jsonstringvalue=jsonstringvalue(getvalue(name))
  310.                 If v
  311.                         Return v.txt
  312.                 EndIf
  313.         End Method
  314.        
  315.         Method getnumbervalue:Double(name$)
  316.                 v:jsonnumbervalue=jsonnumbervalue(getvalue(name))
  317.                 If v
  318.                         Return v.number
  319.                 EndIf
  320.         End Method
  321.        
  322.         Method getliteralvalue(name$)
  323.                 v:jsonliteralvalue=jsonliteralvalue(getvalue(name))
  324.                 If v
  325.                         Return v.value
  326.                 EndIf
  327.         End Method
  328.        
  329.         Method getarrayvalue:jsonarray(name$)
  330.                 v:jsonarray=jsonarray(getvalue(name))
  331.                 Return v
  332.         End Method
  333.        
  334.         Method getobjectvalue:jsonobject(name$)
  335.                 v:jsonobject=jsonobject(getvalue(name))
  336.                 Return v
  337.         End Method
  338.                                
  339.        
  340. End Type
  341.  
  342. Type jsonpair
  343.         Field name$,value:jsonvalue
  344.  
  345.         Function Create:jsonpair(name$,value:jsonvalue)
  346.                 p:jsonpair=New jsonpair
  347.                 p.name=name
  348.                 p.value=value
  349.                 Return p
  350.         End Function
  351.  
  352.         Method repr$(tabs$="")
  353.                 t$="~q"+name+"~q : "
  354.                 For i=1 To (Len(t)+7)/8
  355.                         tabs:+"~t"
  356.                 Next
  357.                 middo$=""
  358.                 For i=1 To (8-(Len(t) Mod 8))
  359.                         middo:+" "
  360.                 Next
  361.                 Return t+middo+value.repr(tabs)
  362.         End Method
  363. End Type
  364.  
  365. Type jsonarray Extends jsonvalue
  366.         Field values:TList
  367.        
  368.         Method New()
  369.                 values=New TList
  370.         End Method
  371.        
  372.         Method repr$(tabs$="")
  373.                 t$="["
  374.                 ntabs$=tabs+"~t"
  375.                 ov:jsonvalue=Null
  376.                 For v:jsonvalue=EachIn values
  377.                         If ov Then t:+","
  378.                         t:+"~n"+ntabs+v.repr(ntabs)
  379.                         ov=v
  380.                 Next
  381.                 t:+"~n"+tabs+"]"
  382.                 Return t
  383.         End Method
  384. End Type
  385.  
  386.  
  387. Type jsonstringvalue Extends jsonvalue
  388.         Field txt$
  389.        
  390.         Function Create:jsonstringvalue(txt$,pretty=1)
  391.                 jsv:jsonstringvalue=New jsonstringvalue
  392.                
  393.                 If pretty
  394.                         otxt$=""
  395.                         i=0
  396.                         For i=0 To Len(txt)-1
  397.                                 Select Chr(txt[i])
  398.                                 Case "~q"
  399.                                         otxt:+"~q"
  400.                                 Case ""
  401.                                         otxt:+"\"
  402.                                 Case "/"
  403.                                         otxt:+"/"
  404.                                 Case Chr(8)
  405.                                         otxt:+""
  406.                                 Case Chr(12)
  407.                                         otxt:+"f"
  408.                                 Case "~n"
  409.                                         otxt:+"
  410. "
  411.                                 Case "~r"
  412.                                         otxt:+"
  413. "
  414.                                 Case "~t"
  415.                                         otxt:+" "
  416.                                 Default
  417.                                         otxt:+Chr(txt[i])
  418.                                 End Select
  419.                         Next
  420.                         jsv.txt=otxt
  421.                 Else
  422.                         jsv.txt=txt
  423.                 EndIf
  424.                 Return jsv
  425.         End Function
  426.        
  427.         Method repr$(tabs$="")
  428.                 Return "~q"+txt+"~q"
  429.         End Method
  430. End Type
  431.  
  432. Type jsonnumbervalue Extends jsonvalue
  433.         Field number:Double
  434.        
  435.         Function Create:jsonnumbervalue(n:Double)
  436.                 jnv:jsonnumbervalue=New jsonnumbervalue
  437.                 jnv.number=n
  438.                 Return jnv
  439.         End Function
  440.        
  441.         Method repr$(tabs$="")
  442.                 Return String(number)
  443.         End Method
  444. End Type
  445.  
  446. Type jsonliteralvalue Extends jsonvalue
  447.         Field value
  448.         '1 - true
  449.         '0 - false
  450.         '-1 - nil
  451.        
  452.         Function Create:jsonliteralvalue(value)
  453.                 jlv:jsonliteralvalue=New jsonliteralvalue
  454.                 jlv.value=value
  455.                 Return jlv
  456.         End Function
  457.        
  458.         Method repr$(tabs$="")
  459.                 Select value
  460.                 Case 1
  461.                         Return "true"
  462.                 Case 0
  463.                         Return "false"
  464.                 Case -1
  465.                         Return "nil"
  466.                 End Select
  467.         End Method
  468. End Type
  469.  
  470.  
  471.  
  472. 'EXAMPLE
  473. f:TStream=ReadFile("json.txt")
  474. txt$=""
  475. While Not Eof(f)
  476.         txt:+f.ReadLine()
  477. Wend
  478.  
  479. j:jsondecoder=jsondecoder.Create(txt)
  480. j.parse()
  481.  
  482.  
  483. For v:jsonvalue=EachIn j.things
  484.         Print v.repr()
  485. Next


Comments :


plash(Posted 1+ years ago)

 Woah.. now we have three!


Warpy(Posted 1+ years ago)

 Yep!


Bobysait(Posted 1+ years ago)

 It's a bmx file, not bb.Whatever, nice job


TomToad(Posted 2 months ago)

 Thanks for the code, almost exactly what I needed.  Not SuperStrict compatible, so here is your code modified to be SuperStrict.
Code: [Select]
'; ID: 2300
'; Author: Warpy
'; Date: 2008-08-21 15:59:54
'; Title: tiny JSON reader/writer
'; Description: decodes / encodes JSON data - see www.json.org

Type jsondecoder
Field txt:String
Field i:Int
Field curchr:String
Field things:TList

Method New()
things=New TList
End Method

Method getnext:Int(tokens:String[],onlywhitespace:Int=1)
Local oldi:Int=i
While i<Len(txt)
Local c:String=Chr(txt[i])
i:+1
For Local token:String=EachIn tokens
If c=token
curchr=c
Return 1
EndIf
Next
If onlywhitespace And (Not (c=" " Or c="~t" Or c="~n" Or c="~r"))
i:-1
Return 0
EndIf
Wend
i=oldi
Return 0
End Method

Function Create:jsondecoder(txt:String)
Local j:jsondecoder=New jsondecoder
j.txt=txt
j.i=0
Return j
End Function

Method parse()
While getnext(["{","["])
Select curchr
Case "{" 'new object
Local o:jsonobject=parseobject()
If Not o
Print "error - couldn't parse object"
EndIf
things.addlast o
Case "[" 'new array
Local a:jsonarray=parsearray()
If Not a
Print "error - couldn't parse array"
EndIf
things.addlast a
End Select
Wend
End Method

Method parseobject:jsonobject()
Local o:jsonobject=New jsonobject
While getnext(["~q","}"])
Select curchr
Case "~q"
Local p:jsonpair=parsepair()
If Not p
Print "error reading pair"
EndIf
o.pairs.addlast p
If Not getnext([",","}"])
Print "error after reading pair - expected either , or }"
EndIf
If curchr="}"
Return o
EndIf
Case "}"
Return o
End Select
Wend

Print "error reading Object - expected a } at least!"
End Method

Method parsepair:jsonpair()
Local p:jsonpair=New jsonpair
p.name=parsestring()
If Not getnext([":"])
Print "error reading pair - expected a :"
EndIf
Local v:jsonvalue=parsevalue()
If Not v
Print "error reading pair - couldn't read a value"
EndIf
p.value=v
Return p
End Method

Method parsearray:jsonarray()
Local a:jsonarray=New jsonarray
While getnext(["~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n","]"])
Select curchr
Case "~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n"
i:-1
Local v:jsonvalue=parsevalue()
a.values.addlast v
If Not getnext([",","]"])
Print "error - expecting , or ]"
EndIf
If curchr="]"
Return a
EndIf

Case "]"
Return a
End Select
Wend
Print "error - expecting a value or ]"
End Method

Method parsestring:String()
Local oldi:Int=i
Local s:String=""

While getnext(["~q",""],0)
s:+txt[oldi..i-1]
Select curchr
Case "~q"
Return s
Case ""
Select Chr(txt[i])
Case "~q"
s:+"~q"
Case ""
s:+""
Case "/"
s:+"/"
Case "b"
s:+Chr(8)
Case "f"
s:+Chr(12)
Case "n"
s:+"~n"
Case "r"
s:+"~r"
Case "t"
s:+"~t"
Case "u"
s:+parseunicode()
End Select
i:+1
End Select
oldi=i
Wend
End Method

Method parseunicode:String()
Local n:Short=0
For Local t:Int=1 To 4
n:*16
Local c:Int=txt[i+t]
If c>48 And c<57
n:+c-48
ElseIf c>=65 And c<=70
n:+c-55
ElseIf c>=97 And c<=102
n:+c-87
EndIf
Next
i:+4
Return Chr(n)
End Method

Method parsevalue:jsonvalue()
If Not getnext(["~q","-","0","1","2","3","4","5","6","7","8","9","{","[","t","f","n"])
Print "error - expecting the beginning of a value"
EndIf
Select curchr
Case "~q"
Local s:String=parsestring()
Return jsonstringvalue.Create(s,0)
Case "-","0","1","2","3","4","5","6","7","8","9"
Local n:Double=parsenumber()
Return jsonnumbervalue.Create(n)
Case "{"
Local o:jsonobject=parseobject()
Return o
Case "["
Local a:jsonarray=parsearray()
Return a
Case "t"
i:+3
Return jsonliteralvalue.Create(1)
Case "f"
i:+4
Return jsonliteralvalue.Create(0)
Case "n"
i:+2
Return jsonliteralvalue.Create(-1)
End Select
End Method

Method parsenumber:Double()
i:-1
Local sign:Int=1
Local n:Double=0
Select Chr(txt[i])
Case "-"
i:+2
Return parsenumber()*(-1)
Case "0"
i:+1
If getnext(["."])
n=parsefraction()
EndIf
Case "1","2","3","4","5","6","7","8","9"
n=parseinteger()
If getnext(["."])
n:+parsefraction()
EndIf
End Select

If Chr(txt[i])="e" Or Chr(txt[i])="E"
i:+1
Select Chr(txt[i])
Case "+"
sign=1
Case "-"
sign=-1
Default
Print "error - not a + or - when reading exponent in number"
End Select
Local e:Int=parseinteger()
n:*10^(sign*e)
EndIf
DebugLog "parsed number "+String(n)
Return n
End Method

Method parsefraction:Double()
Local digits:Int=0
Local n:Double=0
While txt[i]>=48 And txt[i]<=57 And i<Len(txt)
n:*10
n:+txt[i]-48
i:+1
digits:+1
Wend
n:/(10^digits)
If i=Len(txt)
Print "error - reached EOF while reading number"
EndIf
DebugLog "parsed fraction "+String(n)
Return n
End Method

Method parseinteger:Double()
Local n:Double=0
While txt[i]>=48 And txt[i]<=57 And i<Len(txt)
n:*10
n:+txt[i]-48
i:+1
Wend
If i=Len(txt)
Print "error - reached EOF while reading number"
EndIf
DebugLog "parsed integer "+String(n)
Return n
End Method

End Type

Type jsonvalue

Method repr:String(tabs:String="")
Return tabs
End Method
End Type

Type jsonobject Extends jsonvalue
Field pairs:TList

Method New()
pairs=New TList
End Method

Method addnewpair(txt:String,value:jsonvalue)
pairs.addlast jsonpair.Create(txt,value)
End Method

Method repr:String(tabs:String="")
Local t:String="{"
Local ntabs:String=tabs+"~t"
Local op:jsonpair=Null
For Local p:jsonpair=EachIn pairs
If op Then t:+","
t:+"~n"+ntabs+p.repr(ntabs)
op=p
Next
t:+"~n"+tabs+"}"
Return t
End Method

Method getvalue:jsonvalue(name:String)
For Local p:jsonpair=EachIn pairs
If p.name=name
Return p.value
EndIf
Next
End Method

Method getstringvalue:String(name:String)
Local v:jsonstringvalue=jsonstringvalue(getvalue(name))
If v
Return v.txt
EndIf
End Method

Method getnumbervalue:Double(name:String)
Local v:jsonnumbervalue=jsonnumbervalue(getvalue(name))
If v
Return v.number
EndIf
End Method

Method getliteralvalue:Int(name:String)
Local v:jsonliteralvalue=jsonliteralvalue(getvalue(name))
If v
Return v.value
EndIf
End Method

Method getarrayvalue:jsonarray(name:String)
Local v:jsonarray=jsonarray(getvalue(name))
Return v
End Method

Method getobjectvalue:jsonobject(name:String)
Local v:jsonobject=jsonobject(getvalue(name))
Return v
End Method


End Type

Type jsonpair
Field name:String,value:jsonvalue

Function Create:jsonpair(name:String,value:jsonvalue)
Local p:jsonpair=New jsonpair
p.name=name
p.value=value
Return p
End Function

Method repr:String(tabs:String="")
Local t:String="~q"+name+"~q : "
For Local i:Int=1 To (Len(t)+7)/8
tabs:+"~t"
Next
Local middo:String=""
For Local i:Int=1 To (8-(Len(t) Mod 8))
middo:+" "
Next
Return t+middo+value.repr(tabs)
End Method
End Type

Type jsonarray Extends jsonvalue
Field values:TList

Method New()
values=New TList
End Method

Method repr:String(tabs:String="")
Local t:String="["
Local ntabs:String=tabs+"~t"
Local ov:jsonvalue=Null
For Local v:jsonvalue=EachIn values
If ov Then t:+","
t:+"~n"+ntabs+v.repr(ntabs)
ov=v
Next
t:+"~n"+tabs+"]"
Return t
End Method
End Type


Type jsonstringvalue Extends jsonvalue
Field txt:String

Function Create:jsonstringvalue(txt:String,pretty:Int=1)
Local jsv:jsonstringvalue=New jsonstringvalue

If pretty
Local otxt:String=""
Local i:Int=0
For i=0 To Len(txt)-1
Select Chr(txt[i])
Case "~q"
otxt:+"~q"
Case ""
otxt:+"\"
Case "/"
otxt:+"/"
Case Chr(8)
otxt:+""
Case Chr(12)
otxt:+"f"
Case "~n"
otxt:+"
"
Case "~r"
otxt:+""
Case "~t"
otxt:+" "
Default
otxt:+Chr(txt[i])
End Select
Next
jsv.txt=otxt
Else
jsv.txt=txt
EndIf
Return jsv
End Function

Method repr:String(tabs:String="")
Return "~q"+txt+"~q"
End Method
End Type

Type jsonnumbervalue Extends jsonvalue
Field number:Double

Function Create:jsonnumbervalue(n:Double)
Local jnv:jsonnumbervalue=New jsonnumbervalue
jnv.number=n
Return jnv
End Function

Method repr:String(tabs:String="")
Return String(number)
End Method
End Type

Type jsonliteralvalue Extends jsonvalue
Field value:Int
'1 - true
'0 - false
'-1 - nil

Function Create:jsonliteralvalue(value:Int)
Local jlv:jsonliteralvalue=New jsonliteralvalue
jlv.value=value
Return jlv
End Function

Method repr:String(tabs:String="")
Select value
Case 1
Return "true"
Case 0
Return "false"
Case -1
Return "nil"
End Select
End Method
End Type



 

SimplePortal 2.3.6 © 2008-2014, SimplePortal