我有以下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。
答案 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)"]}
希望这会有所帮助!