com.google.gson.internal.LinkedTreeMap不能转换到我的类(com.google.gson.internal.LinkedTreeMap cannot be cast to my class)

I have some problems with getting my object from a JSON string.

I got the class Product

public class Product {    private String mBarcode;    private String mName;    private String mPrice;    public Product(String barcode, String name, String price) {        mBarcode = barcode;        mName = name;        mPrice = price;    }    public int getBarcode() {        return Integer.parseInt(mBarcode);    }    public String getName() {        return mName;    }    public double getPrice() {        return Double.parseDouble(mPrice);    }}    

From my server I get an ArrayList in JSON String representation. For example:

[{"mBarcode":"123","mName":"Apfel","mPrice":"2.7"},{"mBarcode":"456","mName":"Pfirsich","mPrice":"1.1111"},{"mBarcode":"89325982","mName":"Birne","mPrice":"1.5555"}] 

This String is generated like this:

public static  String arrayToString(ArrayList list) {    Gson g = new Gson();    return g.toJson(list);}

To get my Object back I use this function:

public static  ArrayList stringToArray(String s) {    Gson g = new Gson();    Type listType = new TypeToken>(){}.getType();    ArrayList list = g.fromJson(s, listType);    return list;}

But when calling

String name = Util.stringToArray(message).get(i).getName();

I get the error com.google.gson.internal.LinkedTreeMap cannot be cast to object.Product

What am I doing wrong? It looks like it created a List of LinkedTreeMaps but how do i convert those into my Product Object?

解决方案

In my opinion, due to type erasure, the parser can't fetch the real type T at runtime. One workaround would be to provide the class type as parameter to the method.

Something like this works, there are certainly other possible workarounds but I find this one very clear and concise.

public static  List stringToArray(String s, Class clazz) {    T[] arr = new Gson().fromJson(s, clazz);    return Arrays.asList(arr); //or return Arrays.asList(new Gson().fromJson(s, clazz)); for a one-liner}

And call it like:

String name = stringToArray(message, Product[].class).get(0).getName();

翻译:
问 题

从JSON字串取得我的物件时发生问题。



我有产品



  public class Product { private String mBarcode;  private String mName;  private String mPrice;   public Product(String barcode,String name,String price){ mBarcode = barcode;  mName = name;  mPrice = price; }   public int getBarcode(){ return Integer.parseInt(mBarcode); }   public String getName(){ return mName; }   public double getPrice(){ return Double.parseDouble(mPrice); } }   

从我的服务器,我得到一个 ArrayList< Product> in JSON字符串表示形式。例如:


  [{“mBarcode”:“123”,“mName”:“Apfel”,“mPrice”:“ “mBarcode”:“89325982”,“mName”:“ :“Birne”,“mPrice”:“1.5555”}]   

  public static< T> String arrayToString(ArrayList< T> list){ Gson g = new Gson();  return g.toJson(list); }   


要使我的对象回来,我使用这个函数:



  public static< T> ArrayList< T> stringToArray(String s){ Gson g = new Gson(); 类型listType = new TypeToken< ArrayList< T>>(){}。getType();  ArrayList< T> list = g.fromJson(s,listType);  return list; }   

但是当调

  String name = Util.stringToArray(message).get(i).getName();   

我得到错误
com.google.gson.internal.LinkedTreeMap不能被投射到对象。产品

我做错了什么?看起来它创建了一个LinkedTreeMaps列表,但是如何将它转换为我的产品对象?

解决方案

为了进行类型擦除,解析器不能在运行时获取真实类型T.一种解决方法是提供类类型作为方法的参数。


这样的工作原理,当然还有其他可能的解决方法,但我觉得这个很清楚简洁。


  public static< T>列表< T> stringToArray(String s,Class< T []> clazz){ T [] arr = new Gson()。fromJson(s,clazz);  return Arrays.asList(arr); //或者返回Arrays.asList(new Gson()。fromJson(s,clazz)); }   

并像这样调用:

 字符串名称= stringToArray(消息,Product []类).get(0).getName   

更多相关文章

  1. Android wifi的WifiInfo对象详解
  2. Android之JAVASe基础篇-面向对象-IO(九)
  3. Android JNI char* 和jstring类型相互转换函数。
  4. Android中,把XML文件转换成Object对象的方法
  5. android xliff字符串操作
  6. 初学Android,五大布局对象(六)
  7. Android中intent传递对象和Bundle的用法
  8. java/android 使用swig编译c/c++ 代码类型转换
  9. Android中检测手机制式和移动网络类型

随机推荐

  1. [Android] property_get/property_set
  2. 高焕堂讲解之 Intent-based Programming
  3. Android中View的知识体系——(3)View的事件
  4. Google官方usb开发教程理解
  5. [Android] ListView中getView的原理+如何
  6. Android小项目————聊天室(UI篇)
  7. Android耳机拔插事件流程
  8. Android Menu 布局
  9. 1.腾讯微博Android客户端开发——OAuth认
  10. Android之UI学习篇九:使用TabHost实现卡片