RosettaCodeData/Task/JSON/M2000-Interpreter/json.m2000

112 lines
4.4 KiB
Plaintext

MODULE A {
\\ Process data in json format
\\ We can load from external file with Inline "libName"
\\ or multiple files Inline "file1" && "file2"
\\ but here we have the library in a module
Inline Code Lib1
\\ So now we make a Parser object (a group type in M2000)
Parser=ParserClass()
\\ We can display any function, module that is public and known list
Modules ?
\\ And this are all known variables (or and objects)
List !
Document json$
\\ We can load from file
\\ Load.Doc json$, "alfa.json"
json$={{
"alfa":-0.11221e+12,
"array" : [
-0.67,
"alfa1",
[
10,
20
],
"beta1",
1.21e12,
21.12145,
"ok"
],
"delta": false, "epsilon" : true, "Null Value" : null
}}
Save.Doc json$, "json2.json" \\ by default in Utf-8 with BOM
\\ just show multiline text
\\ Report display lines and stop after 3/4 of console height lines
\\ just press a key or click mouse button
Report json$
\\ so now we get text to a new object
alfa=Parser.Eval(json$)
\\ check it
Print Type$(alfa) ' it is a group
Print "alfa.type$=";alfa.type$ \\ this is a read only property
Report "as one line"
Report Parser.Ser$(alfa, 0)
Report "as multiline"
Report Parser.Ser$(alfa, 1)
Print "Using Print"
Print Parser.ReadAnyString$(alfa)
Print "Value for alfa, id alfa"
Print Parser.ReadAnyString$(alfa,"alfa")
Report "as multiline"
Report Parser.Ser$(Parser.Eval(Parser.ReadAnyString$(alfa,"array", 2)), 1)
\\ We get a copy of an array as a Group (a group which return an array)
Alfa3=Parser.Eval(Parser.ReadAnyString$(alfa,"array", 2))
\\ First value is for actual object, second value is a readonly property of this object
Print type$(Alfa3), Alfa3.type$
Dim B()
\\ Now Alfa3 run Value part and pass a pointer of array
\\ B() is an array and here take a pointer to Alfa3 array (as value of Alfa3)
B()=Alfa3
\\ each() make an iterator for B()
N=each(B())
While N {
\\ Using B() we get values always. but if we have "object" or "array" then Print prints items **
Print B(N^)
}
\\ Print show here nothing because if value is object then "print" just leave a column and continue to next one
Print B()
\\ we have to use Group() to get group not value of group (if any).
\\ Group() works for "named" group, not for stored in an array or an inventory or a stack
Print Parser.StringValue$(Group(Alfa3), 0)
Print Parser.StringValue$(Group(Alfa3), 1)
\\ Now we want to pass a new value
\\ Interpreter want to match type of expression from left side to right side
\\ Because Parser.StringValue$ is actual a Group (As property),
\\ we have a second linked name: Parser.StringValue
\\ we have to use Parser.StringValue()
\\ and all values must be groups, as those provided by Parser
Parser.StringValue(Group(Alfa3), 1)=Parser.Numeric(1234)
Print Parser.StringValue$(Group(Alfa3), 1)
Print Parser.StringValue$(Group(Alfa), "array", 2, 0)
\\ we have to use Parser.StringValue$()
Parser.StringValue$(Group(Alfa), "array", 2, 0)=Parser.JString$("Changed to String")
Print Parser.StringValue$(Group(Alfa), "array", 2,0)
Try ok {
Print Parser.StringValue$(Group(Alfa), "array", 2)
}
If Error or not ok Then Print Error$
Parser.StringValue.Add = True
Parser.StringValue$(Group(Alfa), "array", 2, 10)=Parser.JString$("Changed to String 2")
Parser.StringValue(Group(Alfa), "Last value")=Parser.Boolean(true)
Report "as multiline"
Report Parser.Ser$(alfa3, 1)
Report Parser.Ser$(alfa, 1)
Parser.StringValue.Add = False
Parser.StringValue.Del = True
Parser.StringValue(Group(Alfa), "array", 0)=Parser.Null()
Parser.StringValue(Group(Alfa), "delta")=Parser.Null()
Parser.StringValue.Del = False
For Parser {
.StringValue(Group(Alfa), "array", 1,5)=.Arr((.Numeric(10), .Jstring$("ok 20"), .Boolean(true)))
}
Report Parser.Ser$(alfa, 1)
}
// call A
A