From f8854759ff1e33b112357b98d14968e44861f5db Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 12 Jan 2016 23:14:56 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/network/github_timeline.own | 68 ++++++++++++++++++ libs/json-20151123.jar | Bin 0 -> 48224 bytes nbproject/build-impl.xml | 7 +- nbproject/genfiles.properties | 4 +- nbproject/project.properties | 16 ++++- program.own | 18 ++++- .../lib/modules/functions/json_decode.java | 61 ++++++++++++++++ .../lib/modules/functions/json_encode.java | 53 ++++++++++++++ src/com/annimon/ownlang/lib/modules/json.java | 17 +++++ 9 files changed, 235 insertions(+), 9 deletions(-) create mode 100644 examples/network/github_timeline.own create mode 100644 libs/json-20151123.jar create mode 100644 src/com/annimon/ownlang/lib/modules/functions/json_decode.java create mode 100644 src/com/annimon/ownlang/lib/modules/functions/json_encode.java create mode 100644 src/com/annimon/ownlang/lib/modules/json.java diff --git a/examples/network/github_timeline.own b/examples/network/github_timeline.own new file mode 100644 index 0000000..2363f3b --- /dev/null +++ b/examples/network/github_timeline.own @@ -0,0 +1,68 @@ +use "std" +use "http" +use "json" +use "functional" + +header = "* Prints current GitHub timeline *" +println "*" * length(header) +println header +println "*" * length(header) + +// Executes in main thread +//http("https://api.github.com/events", def(r) { +// foreach(jsondecode(r), ::show_github_events) +//}) + +// Executes in new thread +thread(::http, "https://api.github.com/events", def(r) { + foreach(jsondecode(r), ::show_github_events) +}) + +def show_github_events(event) { + println event["created_at"] + actor = event["actor"] + println "User: https://github.com/" + actor["login"] + println github_event_type(event) + println "-" * 50 +} + +def github_event_type(event) { + type = event["type"] + repo = event["repo"] + repo = "https://github.com/" + repo["name"] + payload = event["payload"] + + if (type == "CommitCommentEvent") { + comment = payload["comment"] + return "commented commit in " + repo + "\n" + comment["body"] + } + if (type == "CreateEvent") { + return "created " + payload["ref_type"] + " on " + repo + } + if (type == "DeleteEvent") { + return "deleted " + payload["ref_type"] + " on " + repo + } + if (type == "ForkEvent") { + return "forked repository " + repo + } + if (type == "IssueCommentEvent") { + comment = payload["comment"] + issue = payload["issue"] + return "commented issue " + issue["title"] + " on " + repo + "\n" + comment["body"] + } + if (type == "IssuesEvent") { + issue = payload["issue"] + return payload["action"] + " issue '" + issue["title"] + "' on " + repo + } + if (type == "PullRequestEvent") { + pr = payload["pull_request"] + return payload["action"] + " pull request #" + payload["number"] + " '" + pr["title"] + "' on " + repo + } + if (type == "PushEvent") { + return "pushed " + length(payload["commits"]) + " commits to " + repo + } + if (type == "WatchEvent") { + return "start watching repository " + repo + } + return type + " on " + repo +} diff --git a/libs/json-20151123.jar b/libs/json-20151123.jar new file mode 100644 index 0000000000000000000000000000000000000000..472b253051df5ee5c3aac9c34a575aaf40fc70c3 GIT binary patch literal 48224 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 literal 0 HcmV?d00001 diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index b7e2500..6d4a345 100644 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -222,6 +222,7 @@ is divided into following sections: + @@ -698,7 +699,7 @@ is divided into following sections: - + @@ -773,7 +774,7 @@ is divided into following sections: - + @@ -800,7 +801,7 @@ is divided into following sections: - + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index 1037409..1cc3671 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=8064a381@1.78.0.48 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=48c1b1a1 -nbproject/build-impl.xml.script.CRC32=e3eeb3f1 -nbproject/build-impl.xml.stylesheet.CRC32=2d327b5d@1.78.0.48 +nbproject/build-impl.xml.script.CRC32=b8cd7788 +nbproject/build-impl.xml.stylesheet.CRC32=05530350@1.79.0.48 diff --git a/nbproject/project.properties b/nbproject/project.properties index 9de6066..f4950c5 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,9 +1,10 @@ annotation.processing.enabled=true annotation.processing.enabled.in.editor=false -annotation.processing.processor.options= annotation.processing.processors.list= annotation.processing.run.all.processors=true annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=OwnLang +application.vendor=aNNiMON build.classes.dir=${build.dir}/classes build.classes.excludes=**/*.java,**/*.form # This directory is removed when the project is cleaned: @@ -26,10 +27,21 @@ dist.archive.excludes= dist.dir=dist dist.jar=${dist.dir}/OwnLang.jar dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= excludes= +file.reference.commons-codec-1.6.jar=libs/commons-codec-1.6.jar +file.reference.commons-logging-1.1.3.jar=libs/commons-logging-1.1.3.jar +file.reference.httpclient-4.3.5.jar=libs/httpclient-4.3.5.jar +file.reference.httpcore-4.3.2.jar=libs/httpcore-4.3.2.jar +file.reference.json-20151123.jar=libs/json-20151123.jar includes=** jar.compress=false -javac.classpath= +javac.classpath=\ + ${file.reference.commons-codec-1.6.jar}:\ + ${file.reference.commons-logging-1.1.3.jar}:\ + ${file.reference.httpclient-4.3.5.jar}:\ + ${file.reference.httpcore-4.3.2.jar}:\ + ${file.reference.json-20151123.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/program.own b/program.own index 4cc1cfd..7ac6f02 100644 --- a/program.own +++ b/program.own @@ -128,11 +128,25 @@ println "Sum: " + reduce(squares, 0, def(x, y) = x + y) use "http" -http("http://jsonplaceholder.typicode.com/users", "POST", {"name": "OwnLang", "versionCode": 10}, def(v) { +/*http("http://jsonplaceholder.typicode.com/users", "POST", {"name": "OwnLang", "versionCode": 10}, def(v) { println "Added: " + v http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::http_get_demo) }) def http_get_demo(v) { println "Updated: " + v http("http://jsonplaceholder.typicode.com/users", ::echo) -} +}*/ + +use "json" +println "json" +println jsonencode({ + "name": "JSON Example", + "version": 1, + "arrayData": [ + 1, 2, 3, 4 + ], + "objectData": { + "key": "value", + 10: "1000" + } +}) \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/json_decode.java b/src/com/annimon/ownlang/lib/modules/functions/json_decode.java new file mode 100644 index 0000000..97fb9d5 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/json_decode.java @@ -0,0 +1,61 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.lib.*; +import java.util.Iterator; +import org.json.*; + +public final class json_decode implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new RuntimeException("One argument expected"); + try { + final String jsonRaw = args[0].asString(); + final Object root = new JSONTokener(jsonRaw).nextValue(); + return process(root); + } catch (JSONException ex) { + throw new RuntimeException("Error while parsing json", ex); + } + } + + private Value process(Object obj) { + if (obj instanceof JSONObject) { + return process((JSONObject) obj); + } + if (obj instanceof JSONArray) { + return process((JSONArray) obj); + } + if (obj instanceof String) { + return new StringValue((String) obj); + } + if (obj instanceof Number) { + return new NumberValue(((Number) obj).doubleValue()); + } + if (obj instanceof Boolean) { + return NumberValue.fromBoolean((Boolean) obj); + } + // NULL or other + return NumberValue.ZERO; + } + + private MapValue process(JSONObject json) { + final MapValue result = new MapValue(json.length()); + final Iterator it = json.keys(); + while(it.hasNext()) { + final String key = it.next(); + final Value value = process(json.get(key)); + result.set(new StringValue(key), value); + } + return result; + } + + private ArrayValue process(JSONArray json) { + final int length = json.length(); + final ArrayValue result = new ArrayValue(length); + for (int i = 0; i < length; i++) { + final Value value = process(json.get(i)); + result.set(i, value); + } + return result; + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/json_encode.java b/src/com/annimon/ownlang/lib/modules/functions/json_encode.java new file mode 100644 index 0000000..8263ac1 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/functions/json_encode.java @@ -0,0 +1,53 @@ +package com.annimon.ownlang.lib.modules.functions; + +import com.annimon.ownlang.lib.*; +import java.util.Map; +import org.json.*; + +public final class json_encode implements Function { + + @Override + public Value execute(Value... args) { + if (args.length != 1) throw new RuntimeException("One argument expected"); + try { + final Object root = process(args[0]); + final String jsonRaw = JSONObject.valueToString(root); + return new StringValue(jsonRaw); + } catch (JSONException ex) { + throw new RuntimeException("Error while creating json", ex); + } + } + + private Object process(Value val) { + switch (val.type()) { + case Types.ARRAY: + return process((ArrayValue) val); + case Types.MAP: + return process((MapValue) val); + case Types.NUMBER: + return val.asNumber(); + case Types.STRING: + return val.asString(); + default: + return JSONObject.NULL; + } + } + + private Object process(MapValue map) { + final JSONObject result = new JSONObject(); + for (Map.Entry entry : map) { + final String key = entry.getKey().asString(); + final Object value = process(entry.getValue()); + result.put(key, value); + } + return result; + } + + private Object process(ArrayValue array) { + final JSONArray result = new JSONArray(); + for (Value value : array) { + result.put(process(value)); + } + return result; + } +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/json.java b/src/com/annimon/ownlang/lib/modules/json.java new file mode 100644 index 0000000..6af5997 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/json.java @@ -0,0 +1,17 @@ +package com.annimon.ownlang.lib.modules; + +import com.annimon.ownlang.lib.*; +import com.annimon.ownlang.lib.modules.functions.*; + +/** + * + * @author aNNiMON + */ +public final class json implements Module { + + @Override + public void init() { + Functions.set("jsonencode", new json_encode()); + Functions.set("jsondecode", new json_decode()); + } +}