function json_write_string(string)
{
- # todo: special characters
+ gsub(/\\/, "\\\\", string)
+ gsub(/"/, "\\\"", string)
+ gsub(/\b/, "\\b", string)
+ gsub(/\f/, "\\f", string)
+ gsub(/\n/, "\\n", string)
+ gsub(/\r/, "\\r", string)
+ gsub(/\t/, "\\t", string)
+
return "\"" string "\""
}
function json_tokenize(str, tokens, i, line, items, table, type, found)
{
table["term"] = "^[\\[\\]{}:,]"
- table["str"] = "^\"[^\"]*\""
+ table["str"] = "^\"([^\\\\\"]|\\\\.)*\""
table["num"] = "^[+-]?[0-9]+(.[0-9]+)?"
table["var"] = "^(true|false|null)"
table["space"] = "^[ \\t]+"
return 0
}
}
- return i
#for (i = 0; i < length(tokens); i++)
# printf "%-3s %-5s [%s]\n", i":",
# tokens[i]["type"], tokens[i]["text"]
+
+ return i
}
function json_parse_value(tokens, i, value, key, line, type, text)
text = tokens[i++]["text"]
len = length(text);
text = len == 2 ? "" : substr(text, 2, len-2)
+
+ gsub(/\\\\/, "\\", text)
+ gsub(/\\"/, "\"", text)
+ gsub(/\\b/, "\b", text)
+ gsub(/\\f/, "\f", text)
+ gsub(/\\n/, "\n", text)
+ gsub(/\\r/, "\r", text)
+ gsub(/\\t/, "\t", text)
+
json_copy(value, key, text)
#print "parse_string: [" text "]"
return i
}
-# Nice API?
-function json_load(file, var, line, text, tokens, data, key)
+# String API
+function json_decode(string, var, tokens, data, key)
{
- while ((getline line < file) > 0)
- text = text line
- close(file)
- if (!json_tokenize(text, tokens))
+ if (!json_tokenize(string, tokens))
return ""
if (!json_parse_value(tokens, 0, data, 0))
return ""
return 1
}
+function json_encode(var, pad)
+{
+ return json_write_value(var, pad)
+}
+
+# File API
+function json_load(file, var, line, string)
+{
+ delete var
+ while ((getline line < file) > 0)
+ string = string line "\n"
+ return json_decode(string, var)
+}
+
function json_save(file, var, cmd, tmp)
{
cmd = "mktemp " file ".XXX"
cmd | getline tmp
close(cmd)
- print json_write_value(var) > tmp
+ print json_encode(var) > tmp
close(tmp)
system("mv " tmp " " file)
}
# Test functions
function json_test_write()
{
+ print "Testing JSON Write:"
num = 42
str = "hello, world"
arr[0] = "zero"
json_copy(mix, "obj", obj);
json_copy(dub, "first", mix);
json_copy(dub, "second", mix);
- print json_write_value(num)
- print json_write_value(str)
- print json_write_value(arr)
- print json_write_value(obj)
- print json_write_value(mix)
- print json_write_value(dub)
+ print json_encode(num)
+ print json_encode(str)
+ print json_encode(arr)
+ print json_encode(obj)
+ print json_encode(mix)
+ print json_encode(dub)
}
function json_test_read()
{
- json_tokenize("[8, \"abc\", 9]", tokens)
- json_parse_value(tokens, 0, array, 0)
- print json_write_value(array[0])
+ print "Testing JSON Read:"
+
+ json_decode("[8, \"abc\", 9]", array);
+ print json_encode(array)
- json_tokenize("{\"abc\": 1, \"def\": 2}", tokens)
- json_parse_value(tokens, 0, array, 0)
- print json_write_value(array[0])
+ json_decode("{\"abc\": 1, \"def\": 2}", array)
+ print json_encode(array)
json = "{ \"first\": { \"arr\": [ \"\", \n" \
" -1, \n" \
" \"str\": \"hello, world\" }, \n" \
" \"second\": { \"arr\": [ \"zero\", \n" \
" \"one\", \n" \
- " \"two\" ], \n" \
+ " \"two\", \n" \
+ " \"\\\"\t\r\b\" ], \n" \
" \"number\": 42, \n" \
" \"obj\": { \"A\": \"a!\", \n" \
" \"B\": \"b!\", \n" \
" \"C\": \"c!\" }, \n" \
" \"str\": \"hello, world\" } }\n"
- json_tokenize(json, tokens)
- json_parse_value(tokens, 0, array, 0)
- print json_write_value(array[0])
+ json_decode(json, array)
+ print json_encode(array)
}
function json_test_files()
{
+ print "Testing JSON Files:"
print "load: [" json_load("email.txt", mail) "]"
- print "mail: " json_write_value(mail, " ")
+ print "mail: " json_encode(mail, " ")
mail["andy753421"] = "andy753421@gmail.com"
mail["andy"] = "andy@gmail.com"
mail["somebody"] = "foo@example.com"
- print "mail: " json_write_value(mail, " ")
+ print "mail: " json_encode(mail, " ")
print "save: [" json_save("email.txt", mail) "]"
}