将POJO转换为Map

4

我有以下内容:

public class ChargeRequest {
    @Expose
    private String customerName;
    @Expose
    private String stripeToken;
    @Expose
    private String plan;
    @Expose
    private String[] products;

    gettersAndSetters()...

    public Map<String, Object> toMap() {
        return gson.fromJson(this, new TypeToken<Map<String, Object>>() {
        }.getType());
    }

    public String toString() {
        return gson.toJson(this, getClass());
    }
}

我正在尝试使用Gson将ChargeRequest转换为Map<String, Object>

我的适配器:

public static class JsonAdapter implements  JsonDeserializer<ChargeRequest>{
        @Override
        public ChargeRequest deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            ChargeRequest cr = new ChargeRequest();
            JsonObject o = json.getAsJsonObject();
            o.add("customerName", o.get("customerName"));
            o.add("stripeToken", o.get("stripeToken"));
            o.add("plan", o.get("plan"));
            JsonArray jProds = o.get("products").getAsJsonArray();
            cr.products = new String[jProds.size()];
            for (int i = 0; i < jProds.size(); i++) {
                cr.products[i] = jProds.get(i).getAsString();
            }
            return cr;
        }
}

我遇到了这个问题:类型信息不可用,目标不是原始类型,针对字符串数组。这是怎么回事?

最终更新:我最终决定返回Jackson并且一切正常。

代码:

ObjectMapper om = new ObjectMapper();
Map<String, Object> req = om.convertValue(request, Map.class);

你为什么需要一个映射表?你试图生成哪种JSON格式? - OneCricketeer
我需要一个Stripe API的映射。签名是Charge.create(map) - Muli Yulzary
好的,gson.fromJson 接受一个 JSON 字符串,并尝试创建类型类,对吧? - OneCricketeer
2个回答

7

首先从对象中创建JSON:

Gson gson = new GsonBuilder().create();
String json = gson.toJson(obj);// obj is your object 

然后使用 JSON 创建地图。
Map<String,Object> result = new Gson().fromJson(json, Map.class);

资源链接:

  1. 如何从POJO创建JSONObject
  2. 如何使用Gson将JSON转换为HashMap

备注:POJO代表普通Java对象,HashMap是一种Java集合类型。

显然那不起作用...“JsonDeserializer MapTypeAdapter无法反序列化json对象{"customerName":"a","plan":"sample-plan-1","products":["sample-awesome-product"]},给定类型为接口java.util.Map”。 - Muli Yulzary
在将JSON字符串发送到Gson之前,请确保清除其周围的空格。https://dev59.com/r1XTa4cB1Zd3GeqP2o3L#5426895 @MuliYulzary - SkyWalker
没有空格。 - Muli Yulzary
在这种情况下,您可以按照以下教程从对象创建JSON:https://www.mkyong.com/java/jackson-2-convert-java-object-to-from-json/ - SkyWalker

7

发布简化版:

public final static Map<String, Object> pojo2Map(Object obj) {
    Map<String, Object> hashMap = new HashMap<String, Object>();
    try {
        Class<? extends Object> c = obj.getClass();
        Method m[] = c.getMethods();
        for (int i = 0; i < m.length; i++) {
            if (m[i].getName().indexOf("get") == 0) {
                String name = m[i].getName().toLowerCase().substring(3, 4) + m[i].getName().substring(4);
                hashMap.put(name, m[i].invoke(obj, new Object[0]));
            }
        }
    } catch (Throwable e) {
        //log error
    }
    return hashMap;
}

因为这不需要任何中间转换为json,并保持对象中存在的类型,所以我点了赞。 - gurpal2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接