我在这里有一个非常直接的问题。我需要从API获取JSON并将其转换为我为它们创建的对象。
到目前为止,它会将它们反序列化到我的List中,但每个Metric对象都有空值
JSON进入
{
"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 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;
}
}
容器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;
}
}
转换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();
}
答案 0 :(得分:5)
您可以为JSON对象创建相应的java类。可以按原样映射integer
,string
值。可以像这样解析JSON:
Gson gson = new GsonBuilder().create();
Response r = gson.fromJson(jsonString, Response.class);
以下是一个示例:http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html
答案 1 :(得分:2)
(仅用了7.5个月。)
问题是您尝试反序列化的类结构与JSON结构不匹配。
以下是一个简单的示例,用于反序列化所提供的JSON。输出是
[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);
}
}
答案 2 :(得分:-1)