【发布时间】:2011-09-26 20:33:38
【问题描述】:
我正在尝试编写将 Json 字符串转换为对象的简单函数。
我使用的语言是objective-c,但是这个问题讨论的问题与这个语言无关。
我的问题是,如何知道要映射到非参数化(又名非泛型)列表的 json 数组中的对象类型??
我发现两个 Json Java 库无法解决此问题,Jakson 和 Gson,示例如下:
import java.io.Serializable;
import java.util.List;
import com.google.gson.Gson;
public class Main
{
public static void main(String[] args) throws Exception
{
Gson g = new Gson();
Office o = g.fromJson(
"{\"empx\":\"1\",\"emps\":[{\"firstName\":\"Muhammad\",\"lastName\":\"Abdullah\"},{\"firstName\":\"XX\",\"lastName\":null}]}"
, Office.class);
System.out.println(((Employee)o.getEmps().get(0)).getFirstName());
}
}
class Office
{
private List emps;
private String empx;
public String getEmpx()
{
return empx;
}
public void setEmpx(String empx)
{
this.empx = empx;
}
public List getEmps()
{
return emps;
}
public void setEmps(List emps)
{
this.emps = emps;
}
}
class Employee implements Serializable
{
private static final long serialVersionUID = 1L;
String firstName;
String lastName;
public String getFirstName()
{
return firstName;
}
public String getLastName()
{
return lastName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
}
在Google Gson 中,他们将此数组的对象视为java.lang.Object 类型的对象:
Exception in thread "main" java.lang.ClassCastException: java.lang.Object
但 Jaskon 更聪明,它认为这个 unknown 对象是一个地图:
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap
但是,两者都未能检测到对象(我认为这是不可能的!)
那么,在不支持参数化类型(泛型)的语言中,难道没有办法做到这一点吗?
【问题讨论】:
-
当然,它无法检测到您希望它创建一个
Employee对象:没有任何对Employee的引用!目前还不清楚你在这里实际问的是什么。 -
Wrt Gson,Jackson,检测类型并非不可能,但这需要包含类型信息(多态(去)serailziation),或者在您的调用中指定类型。两者都可以做后者,杰克逊至少可以做前者。
标签: java objective-c json generics gson