Gson将json字符串转化成对象的时候报错
分析:由于将要转化成的对象包含一个接口,无法将其实例化;可以由对象转化为json字符串是因为多态,可以知道接口具体对应的实例类。
举例
要实现json与对象转化的复杂java bean
public class ComplexBean {
private String a;
private int b;
private Address addr;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public Address getAddr() {
return addr;
}
public ComplexBean(String a, int b, Address addr) {
super();
this.a = a;
this.b = b;
this.addr = addr;
}
public ComplexBean() {
// TODO Auto-generated constructor stub
}
public void setAddr(Address addr) {
this.addr = addr;
}
@Override
public String toString() {
return "ComplexBean [a=" + a + ", b=" + b + ", addr=" + addr + "]";
}
其中的接口Address
public interface Address {
}
接口实现一
public class TcpAddress implements Address {
private String addr;
private String mark = "tcp";
public TcpAddress() {
}
public TcpAddress(String addr, String mark) {
super();
this.addr = addr;
this.mark = mark;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
@Override
public String toString() {
return "TcpAddress [addr=" + addr + ", mark=" + mark + "]";
}
接口实现二
public class UdpAddress implements Address {
private String addr;
private int a;
private String mark = "udp";
public UdpAddress(String addr, int a, String mark) {
super();
this.addr = addr;
this.a = a;
this.mark = mark;
}
public UdpAddress() {
super();
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
@Override
public String toString() {
return "UdpAddress [addr=" + addr + ", a=" + a + "]";
}
测试的main方法
import com.google.gson.Gson;
public class MainFuncTest {
public static void main(String[] args) {
TcpAddress tcp = new TcpAddress();
tcp.setAddr("192.2.1.2");
ComplexBean complex = new ComplexBean("yzh", 30, tcp);
Gson gsonUtil = new Gson();
String gson = gsonUtil.toJson(complex);
System.out.println(gson);
ComplexBean bean = gsonUtil.fromJson(gson, ComplexBean.class);
System.out.println(bean);
}
}
报异常:
{"a":"yzh","b":30,"addr":{"addr":"192.2.1.2","mark":"tcp"}}
Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for interface json.test.Address. Registering an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:888)
at com.google.gson.Gson.fromJson(Gson.java:853)
at com.google.gson.Gson.fromJson(Gson.java:802)
at com.google.gson.Gson.fromJson(Gson.java:774)
at json.test.MainFuncTest.main(MainFuncTest.java:14)
Caused by: java.lang.UnsupportedOperationException: Interface can't be instantiated! Interface name: json.test.Address
at com.google.gson.internal.UnsafeAllocator.assertInstantiable(UnsafeAllocator.java:117)
at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:49)
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:223)
... 8 more
修改:
用HashMap转化
import java.util.HashMap;
import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
public class MainFuncTest {
public static void main(String[] args) {
TcpAddress tcp = new TcpAddress();
tcp.setAddr("192.2.1.2");
ComplexBean complex = new ComplexBean("yzh", 30, tcp);
Gson gsonUtil = new Gson();
String gson = gsonUtil.toJson(complex);
System.out.println(gson);
try{
ComplexBean bean = gsonUtil.fromJson(gson, ComplexBean.class);
System.out.println(bean);
}catch(Exception e){
}
HashMap map =gsonUtil.fromJson(gson, HashMap.class);
System.out.println(map);
ComplexBean cb = new ComplexBean();
Address address = null;
if("tcp".equals(((LinkedTreeMap) map.get("addr")).get("mark"))){
address = new TcpAddress((String)((LinkedTreeMap) map.get("addr")).get("addr"),(String)((LinkedTreeMap) map.get("addr")).get("mark"));
}else if("udp".equals(((LinkedTreeMap) map.get("addr")).get("mark"))){
address = new UdpAddress((String)((LinkedTreeMap) map.get("addr")).get("addr"),3,(String)((LinkedTreeMap) map.get("addr")).get("mark"));
}
cb.setA((String)map.get("a"));
cb.setAddr(address);
System.out.println(cb);
}
}
输出正常:
{"a":"yzh","b":30,"addr":{"addr":"192.2.1.2","mark":"tcp"}}
{a=yzh, b=30.0, addr={addr=192.2.1.2, mark=tcp}}
ComplexBean [a=yzh, b=0, addr=TcpAddress [addr=192.2.1.2, mark=tcp]]