Skip to content

URBNG-495 - JSON parser #169

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: android
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions UrbanGame/src/com/blstream/urbangame/webserver/json/JsonParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.blstream.urbangame.webserver.json;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

import com.blstream.urbangame.database.entity.Task;
import com.blstream.urbangame.database.entity.UrbanGame;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonParser {

public static String URBANGAME_URL = "http://urbangame.patronage.blstream.com/";

public UrbanGame getUrbanGameFromJSON(String urbanGaneInJSON) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(UrbanGame.class, new UrbanGameDeserializer());
Gson gson = gsonBuilder.create();

// Parse JSON to Java
return gson.fromJson(urbanGaneInJSON, UrbanGame.class);

}

public List<UrbanGame> getUrbanGameListFromJSON(String urbanGameListInJSON) {
// Configure GSON
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(UrbanGameContainer.class, new UrbanGameListDeserializer());
Gson gson = gsonBuilder.create();

// Parse JSON to Java
UrbanGameContainer container = gson.fromJson(urbanGameListInJSON, UrbanGameContainer.class);

return container.getGameList();
}

public List<Task> getTaskListFromJSON(String taskListInJSON) {

// Configure GSON
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(TaskContainer.class, new TaskListDeserializer());
Gson gson = gsonBuilder.create();

// Parse JSON to Java
TaskContainer container = gson.fromJson(taskListInJSON, TaskContainer.class);

return container.getTaskList();

}

public Task getTaskFromJSON(String taskInJSON) {
// Configure GSON
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Task.class, new TaskDeserializer());
Gson gson = gsonBuilder.create();

// Parse JSON to Java
return gson.fromJson(taskInJSON, Task.class);
}

//deserializer helper methods
//translates difficulty from string to int
public static int parseDifficulty(String difficulty) {
int result = 0;
if (difficulty.equals("very easy")) {
result = 0;
}
else if (difficulty.equals("easy")) {
result = 1;
}
else if (difficulty.equals("medium")) {
result = 2;
}
else if (difficulty.equals("hard")) {
result = 3;
}
else if (difficulty.equals("very hard")) {
result = 4;
}
else if (difficulty.equals("extremely hard")) {
result = 5;
}
return result;
}

public static Drawable drawableFromUrl(String url) throws IOException {
Bitmap x;

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.connect();
InputStream input = connection.getInputStream();

x = BitmapFactory.decodeStream(input);
return new BitmapDrawable(x);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.blstream.urbangame.webserver.json;

import java.util.List;

import com.blstream.urbangame.database.entity.Task;

public class TaskContainer {

private List<Task> taskList;

public TaskContainer(List<Task> list) {
setTaskList(list);
}

public List<Task> getTaskList() {
return taskList;
}

public void setTaskList(List<Task> taskList) {
this.taskList = taskList;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.blstream.urbangame.webserver.json;

import java.lang.reflect.Type;

import com.blstream.urbangame.database.entity.ABCDTask;
import com.blstream.urbangame.database.entity.LocationTask;
import com.blstream.urbangame.database.entity.Task;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

public class TaskDeserializer implements JsonDeserializer<Task> {

@Override
public Task deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
throws JsonParseException {

JsonObject jsonTaskObject = json.getAsJsonObject();

String category = jsonTaskObject.get("category").getAsString();

Task taskResult;

if (category.equals("ABCTask")) {
taskResult = new ABCDTask();
taskResult.setType(Task.TASK_TYPE_ABCD);
JsonArray jsonOptions = jsonTaskObject.get("choices").getAsJsonArray();

String[] answers = new String[jsonOptions.size()];

for (int i = 0; i < jsonOptions.size(); i++) {
JsonObject jsonOption = jsonOptions.get(i).getAsJsonObject();

answers[i] = jsonOption.get("answer").getAsString();
}
((ABCDTask) taskResult).setAnswers(answers);
//FIXME there is no question in JSON

}
else {
taskResult = new LocationTask();
taskResult.setType(Task.TASK_TYPE_LOCATION);
}

taskResult.setId(jsonTaskObject.get("tid").getAsLong());
taskResult.setDescription(jsonTaskObject.get("description").getAsString());
taskResult.setTitle(jsonTaskObject.get("name").getAsString());
taskResult.setMaxPoints(jsonTaskObject.get("maxpoints").getAsInt());

//TODO We don't remember max attempts and it is in JSON
int maxAttempts = jsonTaskObject.get("maxattempts").getAsInt();
taskResult.setIsRepetable(maxAttempts > 1);

return taskResult;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.blstream.urbangame.webserver.json;

import java.lang.reflect.Type;
import java.util.LinkedList;

import com.blstream.urbangame.database.entity.Task;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class TaskListDeserializer implements JsonDeserializer<TaskContainer> {

@Override
public TaskContainer deserialize(final JsonElement json, final Type typeOfT,
final JsonDeserializationContext context) {

JsonObject jsonObject = json.getAsJsonObject();

JsonArray jsonTaskArray = jsonObject.get("_embedded").getAsJsonArray();

LinkedList<Task> resultList = new LinkedList<Task>();

for (int i = 0; i < jsonTaskArray.size(); i++) {
JsonObject jsonTask = jsonTaskArray.get(i).getAsJsonObject();
Task task = new Task() {}; //TODO I don't know what is the task type. I think it shouldn't be like this because we have to now what icon shoud be displayed

task.setId(jsonTask.get("tid").getAsLong());
task.setTitle(jsonTask.get("name").getAsString());
resultList.add(task);
}

return new TaskContainer(resultList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.blstream.urbangame.webserver.json;

import java.util.List;

import com.blstream.urbangame.database.entity.UrbanGame;

public class UrbanGameContainer {

private List<UrbanGame> gameList;

public UrbanGameContainer(List<UrbanGame> list) {
gameList = list;
}

public List<UrbanGame> getGameList() {
return gameList;
}

public void setGameList(List<UrbanGame> gameList) {
this.gameList = gameList;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.blstream.urbangame.webserver.json;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Date;

import com.blstream.urbangame.database.entity.UrbanGame;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

public class UrbanGameDeserializer implements JsonDeserializer<UrbanGame> {

@Override
public UrbanGame deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
throws JsonParseException {

UrbanGame urbanGame = new UrbanGame();

JsonObject jsonObject = json.getAsJsonObject();
urbanGame.setID(jsonObject.get("gid").getAsLong());
urbanGame.setGameVersion(jsonObject.get("version").getAsDouble());
urbanGame.setTitle(jsonObject.get("name").getAsString());
urbanGame.setLocation(jsonObject.get("location").getAsString());
urbanGame.setOperatorName(jsonObject.get("operatorName").getAsString());
try {
urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL
+ jsonObject.get("operatorLogo").getAsString()));
}
catch (IOException e) {
//no internet connection logo stays null
}
urbanGame.setStartDate(new Date(jsonObject.get("startTime").getAsLong()));
urbanGame.setEndDate(new Date(jsonObject.get("endTime").getAsLong()));
urbanGame.setWinningStrategy(jsonObject.get("winning").getAsString());
urbanGame.setDifficulty(JsonParser.parseDifficulty(jsonObject.get("difficulty").getAsString()));
urbanGame.setPrizesInfo(jsonObject.get("awards").getAsString());
try {
urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL
+ jsonObject.get("image").getAsString()));
}
catch (IOException e) {
//no internet connection, image stays null
}

urbanGame.setReward(!(urbanGame.getPrizesInfo() == null || urbanGame.getPrizesInfo().equals("")));
return urbanGame;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.blstream.urbangame.webserver.json;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.LinkedList;

import com.blstream.urbangame.database.entity.UrbanGame;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

public class UrbanGameListDeserializer implements JsonDeserializer<UrbanGameContainer> {

@Override
public UrbanGameContainer deserialize(final JsonElement json, final Type typeOfT,
final JsonDeserializationContext context) throws JsonParseException {

LinkedList<UrbanGame> resultList = new LinkedList<UrbanGame>();

JsonObject jsonObject = json.getAsJsonObject();

JsonArray jsonArray = jsonObject.get("_embedded").getAsJsonArray();

for (int i = 0; i < jsonArray.size(); i++) {
UrbanGame urbanGame = new UrbanGame();
JsonObject jsonObjectArrayElement = jsonArray.get(i).getAsJsonObject();

urbanGame.setID(jsonObjectArrayElement.get("gid").getAsLong());
urbanGame.setGameVersion(jsonObjectArrayElement.get("version").getAsDouble());
urbanGame.setTitle(jsonObjectArrayElement.get("name").getAsString());
urbanGame.setStartDate(new Date(jsonObjectArrayElement.get("startTime").getAsLong()));
urbanGame.setEndDate(new Date(jsonObjectArrayElement.get("endTime").getAsLong()));
urbanGame.setDifficulty(JsonParser.parseDifficulty(jsonObjectArrayElement.get("difficulty").getAsString()));
urbanGame.setOperatorName(jsonObjectArrayElement.get("operatorName").getAsString());
urbanGame.setMaxPlayers(jsonObjectArrayElement.get("maxPlayers").getAsInt());
urbanGame.setPlayers(jsonObjectArrayElement.get("numberOfPlayers").getAsInt());
urbanGame.setPrizesInfo(jsonObjectArrayElement.get("awards").getAsString());
try {
urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL
+ jsonObjectArrayElement.get("operatorLogo").getAsString()));
}
catch (IOException e) {
//no internet connection logo stays null
}
try {
urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL
+ jsonObjectArrayElement.get("image").getAsString()));
}
catch (IOException e) {
//no internet connection, image stays null
}

urbanGame.setReward(!(urbanGame.getPrizesInfo() == null || urbanGame.getPrizesInfo().equals("")));

resultList.add(urbanGame);

}

return new UrbanGameContainer(resultList);
}

}