16

jsonコンテンツをPOJOに変換せずに変更したい。GSONライブラリを使用しています。

ユースケースは次のとおりです。

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";

JsonElement jsonElement = gson.fromJson(jsonString, JsonElement.class);     

物事をPOJOに変換せずに、各配列でkey1の値をある値(「テスト」としましょう)に設定できる方法はありますか?

4

6 に答える 6

13

これが私が思いついた最短のものです。

JsonElement je = new Gson().fromJson(jsonString, JsonElement.class);
JsonObject jo = je.getAsJsonObject();
jo.add("key", value);

JsonObject を取得すると、gson にはそれを操作するための多くのメソッドがあります。

于 2013-04-10T05:01:29.887 に答える
3

いつでも JsonElement とは異なる型を取得するか、JsonElement.getAsJsonObject を使用してオブジェクトにキャストできます (可能な場合)。

String jsonString = "[{\"key1\":\"Hello\",\"key2\":\"World\"}, ...]";

JsonArray jsonArray = gson.fromJson(jsonString, JsonElement.class).getAsJsonArray();
JsonObject firstObject = jsonArray.get(i).getAsJsonObject();
firstObject.addProperty("key1", "Test");

私は以前間違っていました。JsonArray アダプターがないようです。JsonElement を取得し、キャスト ツールを使用する必要があります。

于 2013-01-24T17:25:57.277 に答える
2

1 つのアプローチは、JSON を に変換しjava.util.Map、Map を変更して、そこから移動することです (これは、Map を JSON にシリアル化することを意味する場合があります)。

このアプローチは、適切なジョブに適切な API を使用するという私の好みを満たし、Gson のようなツールを使用してシリアライゼーション/デシリアライゼーションを処理することを最小限に抑えます (これが目的で設計されていると私は理解しています)。つまり、Gson API を代替データ構造として使用しないことです。

于 2013-01-24T16:21:20.163 に答える
0

jsonString はプレーンな通常の Java String です。そのため、Java の標準 String 関数を使用して好きなように変更し、部分文字列key1Test1次のように置き換えることができます。

jsonString = "[{\"key1\":\"Test\",\"key2\":\"World\"},{\"key1\":\"Nice\",\"key2\":\"Town\"}]";

もちろん、Java の String は不変であるため、最初に StringBuilder に変換すると、メモリ使用量の点でパフォーマンスが向上する可能性があります。

于 2013-01-24T17:24:29.017 に答える
0

GSON には (組み合わせ可能な) 2 つの別個の API があります。1 つはシリアライゼーションとデシリアライゼーションに使用され、もう 1 つはストリーミングに使用されます。JSON のストリームをメモリ オーバーヘッドなしで、または動的構造 (静的 POJO ではなく) を使用して処理したい場合は、次のようにすることができます。

  • JsonWriter を作成します (私の例では StringWriter を使用しています)。
  • JsonReader を作成します。
  • リーダーからのイベントを消費してライターにフィードするループを作成し、変更、追加、省略などを行う可能性があります。

ループは、考えられるすべてのイベント (10 個) のケースを持つ必要がある単一の switch ステートメントで構成されます。最も単純な例でさえ、それらすべてが含まれている必要があるため、以下のコードはかなり冗長に見えます。ただし、拡張は非常に簡単で、さらに拡張してもそれほど長くはなりません。

"test": 1 ペアを各オブジェクトに追加する例は次のようになります。

public class Whatever {

static void streamandmodify(JsonReader reader, JsonWriter writer) throws IOException {
    while (true) {
        JsonToken token = reader.peek();
        switch (token) {
        // most cases are just consume the event
        // and pass an identical one to the writer
        case BEGIN_ARRAY:
            reader.beginArray();
            writer.beginArray();
            break;
        case END_ARRAY:
            reader.endArray();
            writer.endArray();
            break;
        case BEGIN_OBJECT:
            reader.beginObject();
            writer.beginObject();

            // this is where the change happens:
            writer.name("test");
            writer.value(1);
            break;
        case END_OBJECT:
            reader.endObject();
            writer.endObject();
            break;
        case NAME:
            String name = reader.nextName();
            writer.name(name);
            break;
        case STRING:
            String s = reader.nextString();
            writer.value(s);
            break;
        case NUMBER:
            String n = reader.nextString();
            writer.value(new BigDecimal(n));
            break;
        case BOOLEAN:
            boolean b = reader.nextBoolean();
            writer.value(b);
            break;
        case NULL:
            reader.nextNull();
            writer.nullValue();
            break;
        case END_DOCUMENT:
            return;
        }
    }
}


public static void main(String[] args) throws IOException {
    // just for test:
    JsonReader jr = new JsonReader(new StringReader("{\"a\":1, \"b\":{\"c\":[1,2,3,{},{}]}}"));
    StringWriter sw = new StringWriter();
    JsonWriter jw = new JsonWriter(sw);
    streamandmodify(jr, jw);
    System.out.println(sw.getBuffer().toString());
}
}
于 2013-01-24T17:14:17.760 に答える
0

GSON JsonArray Java 8 で json を変更する

GSON を使用して JSON 内の値を変更する方法の例

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class ModifyJson {
    public static void main(String[] args) {
        String data = "[{\"ct_pk\":24,\"ct_name\":\"SISTEMA DE PRUEBAS\"},"
                + "{\"ct_pk\":1,\"ct_name\":\"CAPITAL FEDERAL\"}," +
                "{\"ct_pk\":5,\"ct_name\":\"SISTEMA DE PRUEBAS DOS\"}]";

        System.out.println("before................." + data);

        JsonArray jsonArray = new Gson().fromJson(data, JsonElement.class).getAsJsonArray();
        JsonArray jsonArray2 = new JsonArray();
        for (JsonElement pa : jsonArray) {
            JsonObject jsonObject2 = pa.getAsJsonObject();
            String ct_name = jsonObject2.get("ct_name").getAsString();
            if (ct_name.equals("SISTEMA DE PRUEBAS")) {
                jsonObject2.addProperty("ct_name", "TODOS");
            }
            jsonArray2.add(jsonObject2);
        }
        System.out.println("after.................." +jsonArray2);
    }
}
于 2019-04-24T23:54:30.310 に答える