使用Gson从类对象创建org.json.JSONObject

时间:2019-06-19 06:30:19

标签: java json gson

我有以下Java类

public static class LogItem {
    public Long timestamp;
    public Integer level;
    public String topic;
    public String type;
    public String message;
}

,我想将ArrayList<LogItem>转换为以下JSON字符串:

{"logitems":[
  {"timestamp":1560924642000, "level":20, "topic":"websocket", "type":"status", "message":"connected (mobile)"},
  ...
]}`

我想执行以下操作:

JSONArray logitems = new JSONArray();
for (DB_LogUtils.LogItem item : items) {
    logitems.put(DB_LogUtils.asJSONObject(item)); // <----
}
JSONObject data = new JSONObject();
data.put("logitems", logitems);
webViewFragment.onInjectMessage(data.toString(), null);

其中DB_LogUtils.asJSONObject是以下方法

public static JSONObject asJSONObject(LogItem item) throws JSONException
{
    JSONObject logitem = new JSONObject();
    logitem.put("timestamp", item.timestamp);
    logitem.put("level",     item.level);
    logitem.put("topic",     item.topic);
    logitem.put("type",      item.type);
    logitem.put("message",   item.message);
    return logitem;
}

但我不想使用logitem.put("timestamp", item.timestamp);来手动执行此操作(例如,Gson),这样我最终会遇到类似的情况

JSONArray logitems = new JSONArray();
for (DB_LogUtils.LogItem item : items) {
    logitems.put(new Gson().toJSONObject(item)); // <----
}
JSONObject data = new JSONObject();
data.put("logitems", logitems);
webViewFragment.onInjectMessage(data.toString(), null);

当LogItem类更改时,不必在多个点上编辑代码。

但是Gson().toJSONObject(...)不存在,只有Gson().toJson(...),它返回一个String。我不想过渡到String,然后再用org.json.JSONObject进行解析。

我结束了第二堂课

public static class LogItems {
    public List<LogItem> logitems = new ArrayList<>();
}

然后让我将整个代码更改为

webViewFragment.onInjectMessage(new Gson().toJson(items), null);

其中items的类型为LogItems

在这种情况下,创建额外的包装器类是一个整体好处,但是我仍然想知道如何使用Gson从类中创建这样的JSONObject。

1 个答案:

答案 0 :(得分:0)

据我所知,不使用for循环将json字符串迭代到数组中并使用相同的键存储到map中是不可能的。

但是您可以实现解决方案,而不用传递d来将项目列表按以下方式传递到gson对象中。

    List<Object> list = new ArrayList<Object>();
    list.add("1560924642000");
    list.add(20);
    list.add("websocket");
    list.add("status");
    list.add("connected (mobile)");
    Gson gson = new Gson();
    Map mp = new HashMap();
    mp.put("ietams", list);
    String json = gson.toJson(mp);
    System.out.println(json);

输出将为

   {"logitems":["1560924642000",20,"websocket","status","connected (mobile)"]}

希望这会有所帮助!