使用JSONObject类转换字符串含有集合类型的属性 JSON字符串转换object错误:MorphDynaBean cannot be cast to com.softright.bean.Tes

解决方法:

如果转换的类中有集合,可以先定义Map<String, Class> classMap = new HashMap<String, Class>();

在classMap中put你要转换的类中的集合名,像classMap.put("data", VideoStatusData.class);

然后在toBean()的时候把参数加上, 像:VideoNormalData vd1 = (VideoNormalData) JSONObject.toBean(JSONObject.fromObject(str), VideoNormalData.class,classMap);


解析代码:

      List<VideoStatusData> list = new LinkedList<VideoStatusData>();
        list.add(new VideoStatusData("live","test"));
        list.add(new VideoStatusData("live","A361_2"));
        VideoNormalData vd = new VideoNormalData("get_stream_status",list);
        String json = JSONObject.fromObject(vd).toString();
        TcpData tcp = new TcpData("****",3230,json);
        String str = tcp.Do();//返回json格式字符串 如下

       //{"succ":"0","msg":"stream status result.","data":[{"app":"live","stream":"test","status":"running"},{"app":"live","stream":"A361_2","status":"stoped"}]}

        Map<String, Class> classMap = new HashMap<String, Class>();
        classMap.put("data", VideoStatusData.class);
        VideoNormalData vd1 = (VideoNormalData) JSONObject.toBean(JSONObject.fromObject(str), VideoNormalData.class,classMap);

//全部测试代码如下

package api.method;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import api.basic.TcpData;
import api.data.VideoNormalData;
import api.data.VideoStatusData;

public class VideoStatusRequest {
    
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        List<VideoStatusData> list = new LinkedList<VideoStatusData>();
        list.add(new VideoStatusData("live","test"));
        list.add(new VideoStatusData("live","A361_2"));
        VideoNormalData vd = new VideoNormalData("get_stream_status",list);
        String json = JSONObject.fromObject(vd).toString();
        TcpData tcp = new TcpData("*****",3230,json);
        String str = tcp.Do();
        Map<String, Class> classMap = new HashMap<String, Class>();
        classMap.put("data", VideoStatusData.class);
        VideoNormalData vd1 = (VideoNormalData) JSONObject.toBean(JSONObject.fromObject(str), VideoNormalData.class,classMap);
        System.out.println(vd1.getData().get(0).getStatus());
    }

}


//VideoNormalData 对象代码:

package api.data;

import java.util.List;

public class VideoNormalData {
    
    public VideoNormalData() {
    }
    public VideoNormalData(String action, List<VideoStatusData> params) {
        this.action = action;
        this.params = params;
    }
    private String action;
    private String succ;
    private String msg;
    private List<VideoStatusData> params;
    private List<VideoStatusData> data;
    
    public String getAction() {
        return action;
    }
    public void setAction(String action) {
        this.action = action;
    }
    public String getSucc() {
        return succ;
    }
    public void setSucc(String succ) {
        this.succ = succ;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public List<VideoStatusData> getParams() {
        return params;
    }
    public void setParams(List<VideoStatusData> params) {
        this.params = params;
    }
    public List<VideoStatusData> getData() {
        return data;
    }
    public void setData(List<VideoStatusData> data) {
        this.data = data;
    }
}

//VideoStatusData 对象代码

package api.data;

public class VideoStatusData {
    
    public VideoStatusData() {
    }
    public VideoStatusData(String app, String stream) {
        this.app = app;
        this.stream = stream;
    }
    private String app;
    private String stream;
    private String status;
    public String getApp() {
        return app;
    }
    public void setApp(String app) {
        this.app = app;
    }
    public String getStream() {
        return stream;
    }
    public void setStream(String stream) {
        this.stream = stream;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    
}

//TcpData 代码

package api.basic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

public class TcpData {
    
    private String hostname;
    private int port;
    private String content;
    
    public TcpData(String hostname, int port,String content){
        this.hostname = hostname;
        this.port = port;
        this.content = content;
    }
    
    public  String Do() throws Exception
    {
        String result="";
        PrintWriter  out = null;
        BufferedReader in = null;
        try
        {
            Socket socket = new Socket();
            //socket链接指定的主机,超过10秒抛出链接不上异常
            socket.connect(new InetSocketAddress(hostname,port), 10000);
            // 得到请求的输出流对象  
            out = new PrintWriter(socket.getOutputStream());
            // 发送请求参数
            out.print(content);
            // flush输出流的缓冲
            out.flush();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            System.out.println("获取的结果为:"+result);  
        }
        catch(Exception ex)
        {
            System.out.println("发送 POST 请求出现异常!"+ex);
            ex.printStackTrace();
            throw ex;
        }
        finally
        {
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值