Unable to invoke no-args constructor for interface.... Registering an InstanceCreator

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]]





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值