Как сериализовать JsonObject без лишних кавычек? - PullRequest
2 голосов
/ 16 января 2012

Я пишу небольшую беглую оболочку над com.google.gson.JsonObject.

Когда я сериализую свой Json, я получаю:

{"key1":"value1","key2":"value2","key3":"{\"innerKey\":\"value3\"}"}

Как мне избавиться отлишние кавычки?

Мой код:

public class JsonBuilder {
    private final JsonObject json = new JsonObject();
    private final Map<String, JsonBuilder> children = newHashMap();

    public String toJson() {
        for (Map.Entry<String, JsonBuilder> entry : children.entrySet()) {
            String value = entry.getValue().toJson();
            add(entry.getKey(), value);
        }
        children.clear();

        return json.toString();
    }

    public JsonBuilder add(String key, String value) {
        json.addProperty(key, value);
        return this;
    }

    public JsonBuilder add(String key, JsonBuilder value) {
        Preconditions.checkArgument(!children.containsKey(key));
        children.put(key, value);
        return this;
    }
}

String json = new JsonBuilder()
    .add("key1", "value1")
    .add("key2", "value2")
    .add("key3", new JsonBuilder()
        .add("innerKey", "value3"))
    .toJson();

Ответы [ 3 ]

3 голосов
/ 16 января 2012

Проблема в том, что вы смешали строки и объекты в своем классе JsonBuilder. Скорее придерживайтесь как можно ближе к JsonObject, и только слегка вытяните его. Если вы хотите обернуть JsonBuilder, сделайте это так с наименьшим возможным изменением JsonObject:

package com.craigmj.gson;

import java.util.HashMap;

import com.google.gson.JsonObject;

class JsonBuilder {
    public final JsonObject json = new JsonObject();

    public String toJson() {
        return json.toString();
    }

    public JsonBuilder add(String key, String value) {
        json.addProperty(key, value);
        return this;
    }

    public JsonBuilder add(String key, JsonBuilder value) {
        json.add(key, value.json);
        return this;
    }
}

public class GsonTest {

    public static void main(String[] args) {

        System.out.println(new JsonBuilder()
            .add("key1", "value1")
            .add("key2", "value2")
            .add("key3", new JsonBuilder()
            .add("innerKey", "value3"))
            .toJson());
    }

}

Обратите внимание, что я сделал свойство json общедоступным, чтобы вы могли по-прежнему использовать все методы gson, если вам нужна полная функциональность gson. (Конечно, у вас, вероятно, должен быть получатель.) К сожалению, нельзя расширять JsonObject, поскольку он является окончательным.

1 голос
/ 07 ноября 2013

Используйте взамен gson.toJsonTree ().

0 голосов
/ 25 ноября 2015

Вы можете взглянуть на это https://github.com/FasterXML/jackson-jr#writing-with-composers

Jackson jr - это компактная альтернатива полному компоненту Jackson Databind.

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