Skip to content

Commit

Permalink
Removed memory allocations from the parsing loops
Browse files Browse the repository at this point in the history
  • Loading branch information
alt236 committed Jan 7, 2013
1 parent 770b698 commit 96b0dd7
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 126 deletions.
40 changes: 27 additions & 13 deletions src/com/martinadamek/jsonandroid/AndroidJson.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package com.martinadamek.jsonandroid;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.io.*;
import java.util.*;

public class AndroidJson implements TestJson {

Expand All @@ -18,21 +24,29 @@ public List<Map> parsePublicTimeline(InputStream inputStream) {
List<Map> result = new ArrayList<Map>();

try {
String json = convertStreamToString(inputStream);
Map map;
JSONObject jsonObject;
JSONObject user;
Iterator iterator;
Iterator iterator2;
String key;
String key2;

String json = convertStreamToString(inputStream);
JSONArray jsonArray = new JSONArray(json);
int length = jsonArray.length();

for (int i = 0; i < length; i++) {
Map map = new HashMap();
JSONObject jsonObject = jsonArray.getJSONObject(i);
Iterator iterator = jsonObject.keys();
map = new HashMap();
jsonObject = jsonArray.getJSONObject(i);
iterator = jsonObject.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
key = (String) iterator.next();
if ("user".equals(key)) {
JSONObject user = jsonObject.getJSONObject(key);
Iterator iterator2 = user.keys();
user = jsonObject.getJSONObject(key);
iterator2 = user.keys();
while (iterator2.hasNext()) {
String key2 = (String) iterator2.next();
key2 = (String) iterator2.next();
map.put("user." + key2, user.get(key2));
}
} else {
Expand Down
130 changes: 66 additions & 64 deletions src/com/martinadamek/jsonandroid/GsonJson.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package com.martinadamek.jsonandroid;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
Expand All @@ -11,68 +8,73 @@
import java.util.List;
import java.util.Map;

public class GsonJson implements TestJson {

public String getName() {
return "Gson";
}

public List<Map> parsePublicTimeline(InputStream inputStream) {

List<Map> result = new ArrayList<Map>();

try {
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));

reader.beginArray();
while (reader.hasNext()) {
Map map = new HashMap();

reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if ("user".equals(name)) {
reader.beginObject();
while (reader.hasNext()) {
String name2 = reader.nextName();
map.put("user." + name2, getValue(reader));
}
reader.endObject();
} else {
map.put(name, getValue(reader));
}
}

reader.endObject();

result.add(map);
}
reader.endArray();


} catch (Exception e) {
e.printStackTrace();
}

return result;
}

static Object getValue(JsonReader r) throws IOException {
Object value = null;
JsonToken token = r.peek();
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

switch (token) {
case NULL:
r.nextNull();
break;
case BOOLEAN:
value = r.nextBoolean();
break;
default:
value = r.nextString();
}
public class GsonJson implements TestJson {

return value;
}
public String getName() {
return "Gson";
}

public List<Map> parsePublicTimeline(InputStream inputStream) {

List<Map> result = new ArrayList<Map>();

try {
Map map;
String name;
String name2;

JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));

reader.beginArray();

while (reader.hasNext()) {
map = new HashMap();
reader.beginObject();

while (reader.hasNext()) {
name = reader.nextName();
if ("user".equals(name)) {
reader.beginObject();
while (reader.hasNext()) {
name2 = reader.nextName();
map.put("user." + name2, getValue(reader));
}
reader.endObject();
} else {
map.put(name, getValue(reader));
}
}

reader.endObject();
result.add(map);
}
reader.endArray();
} catch (Exception e) {
e.printStackTrace();
}

return result;
}

static Object getValue(JsonReader r) throws IOException {
Object value = null;
JsonToken token = r.peek();

switch (token) {
case NULL:
r.nextNull();
break;
case BOOLEAN:
value = r.nextBoolean();
break;
default:
value = r.nextString();
}

return value;
}

}
18 changes: 11 additions & 7 deletions src/com/martinadamek/jsonandroid/JacksonJson.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.martinadamek.jsonandroid;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;

public class JacksonJson implements TestJson {

private static JsonFactory sJsonFactory = new JsonFactory();
Expand All @@ -24,22 +24,26 @@ public List<Map> parsePublicTimeline(InputStream inputStream) {
List<Map> result = new ArrayList<Map>();

try {
Map map;
String key;
String key2;

JsonParser p = sJsonFactory.createJsonParser(inputStream);

p.nextToken();

while (p.nextToken() != JsonToken.END_ARRAY) {

Map map = new HashMap();
map = new HashMap();

while (p.nextToken() != JsonToken.END_OBJECT) {

String key = p.getCurrentName();
key = p.getCurrentName();
p.nextToken(); // move to value, or START_OBJECT/START_ARRAY

if (p.getCurrentToken() == JsonToken.START_OBJECT) {
while (p.nextToken() != JsonToken.END_OBJECT) {
String key2 = p.getCurrentName();
key2 = p.getCurrentName();
p.nextToken(); // move to value, or START_OBJECT/START_ARRAY
map.put("user." + key2, p.getText());
}
Expand Down
28 changes: 19 additions & 9 deletions src/com/martinadamek/jsonandroid/SimpleJson.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.martinadamek.jsonandroid;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

public class SimpleJson implements TestJson {

public String getName() {
Expand All @@ -20,18 +24,24 @@ public List<Map> parsePublicTimeline(InputStream inputStream) {

JSONParser p = new JSONParser();
try {
Map map;
Set keys;
Set keys2;
JSONObject user;
JSONObject jsonObject;

JSONArray jsonArray = (JSONArray) p.parse(new InputStreamReader(inputStream));
int size = jsonArray.size();

for (int i = 0; i < size; i++) {
Map map = new HashMap();
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
map = new HashMap();
jsonObject = (JSONObject) jsonArray.get(i);

Set keys = jsonObject.keySet();
keys = jsonObject.keySet();
for (Object key: keys) {
if ("user".equals(key)) {
JSONObject user = (JSONObject) jsonObject.get(key);
Set keys2 = user.keySet();
user = (JSONObject) jsonObject.get(key);
keys2 = user.keySet();
for (Object key2: keys2) {
map.put("user." + key2, user.get(key2));
}
Expand Down
Loading

0 comments on commit 96b0dd7

Please sign in to comment.