Создать org.json.JSONObject из объекта класса с помощью Gson - PullRequest
0 голосов
/ 19 июня 2019

У меня есть следующий класс 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.

В этом случае создание дополнительного класса-оболочки было общим преимуществом, но я все еще хотел бычтобы узнать, как я могу создать такой JSONObject из класса с помощью Gson.

1 Ответ

0 голосов
/ 19 июня 2019

Насколько я знаю, это было бы невозможно без использования цикла for для итерации строки json в массив и сохранения на карте с тем же ключом.

Но вы можете достичь своего решения, вместо того, чтобы передавать 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)"]}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...