Reputation: 511
I have a very straight forward issue here. I need to take JSON coming from the API and convert it to objects I created for them.
This far, it will deserialize them into my List but each Metric object has null values
JSON COMING IN
{
"metrics": [
{
"metric": {
"type": 1,
"name": "slide-11-start",
"value": "1287249598295",
"sessionID": ""
}
},
{
"metric": {
"type": 1,
"name": "slide-21-start",
"value": "1287249601368",
"sessionID": ""
}
},
{
"metric": {
"type": 7,
"name": "resolution",
"value": "1680x1050",
"sessionID": ""
}
},
{
"metric": {
"type": 6,
"name": "OS",
"value": "Linux",
"sessionID": ""
}
},
{
"metric": {
"type": 5,
"name": "browser",
"value": "Netscape",
"sessionID": ""
}
}
]
}
Metric Object
public class Metric {
private int type;
private String name;
private String value;
private String sessionID;
/**
* @return the type
*/
public int getType() {
return type;
}
/**
* @param type the type to set
*/
public void setType(int type) {
this.type = type;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
/**
* @return the sessionID
*/
public String getSessionID() {
return sessionID;
}
/**
* @param sessionID the sessionID to set
*/
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
}
Container Ojbect
import java.util.List;
/**
*
* @author joshua
*/
public class MetricSet {
private List<Metric> metrics;
/**
* @return the metrics
*/
public List<Metric> getMetrics() {
return metrics;
}
/**
* @param metrics the metrics to set
*/
public void setMetrics(List<Metric> metrics) {
this.metrics = metrics;
}
}
CODE TO CONVERT THE JSON
String json = "";
if(request.getParameter("data") != null) {
json = request.getParameter("data");
}
MetricSet metrics = new MetricSet();
try {
Gson gson = new Gson();
Type listType = new TypeToken<MetricSet>() {}.getType();
metrics = gson.fromJson(json, MetricSet.class);
}
catch(Exception ex) {
String msg = ex.toString();
}
Upvotes: 8
Views: 22484
Reputation: 2095
You can create corresponding java classes for the JSON objects. The integer
, string
values can be mapped as is. JSON can be parsed like this:
Gson gson = new GsonBuilder().create();
Response r = gson.fromJson(jsonString, Response.class);
Here is an example: http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html
Upvotes: 8
Reputation: 67003
(It's only been 7.5 months.)
The problem is that the class structure you're trying to deserialize to doesn't match the JSON structure.
Following is a simple example that works to deserialize the JSON provided. The output is
[Metrics: [ [MetricContainer: [Metric: type=1, name=slide-11-start, value=1287249598295, sessionID=]], [MetricContainer: [Metric: type=1, name=slide-21-start, value=1287249601368, sessionID=]], [MetricContainer: [Metric: type=7, name=resolution, value=1680x1050, sessionID=]], [MetricContainer: [Metric: type=6, name=OS, value=Linux, sessionID=]], [MetricContainer: [Metric: type=5, name=browser, value=Netscape, sessionID=]]]]
public class Foo
{
static String jsonInput =
"{" +
"\"metrics\":" +
"[" +
"{" +
"\"metric\":" +
"{" +
"\"type\":1," +
"\"name\":\"slide-11-start\"," +
"\"value\":\"1287249598295\"," +
"\"sessionID\":\"\"" +
"}" +
"}," +
"{" +
"\"metric\":" +
"{" +
"\"type\":1," +
"\"name\":\"slide-21-start\"," +
"\"value\":\"1287249601368\"," +
"\"sessionID\":\"\"" +
"}" +
"}," +
"{" +
"\"metric\":" +
"{" +
"\"type\":7," +
"\"name\":\"resolution\"," +
"\"value\":\"1680x1050\"," +
"\"sessionID\":\"\"" +
"}" +
"}," +
"{" +
"\"metric\":" +
"{" +
"\"type\":6," +
"\"name\":\"OS\"," +
"\"value\":\"Linux\"," +
"\"sessionID\":\"\"" +
"}" +
"}," +
"{" +
"\"metric\":" +
"{" +
"\"type\":5," +
"\"name\":\"browser\"," +
"\"value\":\"Netscape\"," +
"\"sessionID\":\"\"" +
"}" +
"}" +
"]" +
"}";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
Metrics metrics = gson.fromJson(jsonInput, Metrics.class);
System.out.println(metrics);
}
}
class Metrics
{
private List<MetricContainer> metrics;
@Override
public String toString()
{
return String.format(
"[Metrics: %1$s]",
metrics);
}
}
class MetricContainer
{
private Metric metric;
@Override
public String toString()
{
return String.format(
"[MetricContainer: %1$s]",
metric);
}
}
class Metric
{
private int type;
private String name;
private String value;
private String sessionID;
@Override
public String toString()
{
return String.format(
"[Metric: type=%1$d, name=%2$s, value=%3$s, sessionID=%4$s]",
type, name, value, sessionID);
}
}
Upvotes: 2