8

GoogleGSONを使用してJavaオブジェクトをJSONに変換しています。

現在、私は次の構造を持っています:

"Step": {
  "start_name": "Start",
  "end_name": "End",
  "data": {
    "duration": {
      "value": 292,
      "text": "4 min."
    },
    "distance": {
       "value": 1009.0,
       "text": "1 km"
    },
    "location": {
       "lat": 59.0000,
       "lng": 9.0000,
       "alt": 0.0
    }
  }
}

現在、Durationオブジェクトはオブジェクト内にありDataます。次のように、オブジェクトをスキップしてDataオブジェクトをオブジェクトに移動しDurationますStep

"Step": {
  "start_name": "Start",
  "end_name": "End",
  "duration": {
    "value": 292,
    "text": "4 min."
  },
  "distance": {
     "value": 1009.0,
     "text": "1 km"
  },
  "location": {
     "lat": 59.0000,
     "lng": 9.0000,
     "alt": 0.0
  }
}

GSONを使用してこれを行うにはどうすればよいですか?

編集:TypeAdapterを使用してStep.classを変更しようとしましたが、write-methodでdurationオブジェクトをJsonWriterに追加できません。

4

4 に答える 4

7

おそらくこれを行うには、 のカスタムシリアライザーStep作成して登録しDuration、その中でData.

// registering your custom serializer:
GsonBuilder builder = new GsonBuilder ();
builder.registerTypeAdapter (Step.class, new StepSerializer ());
Gson gson = builder.create ();
// now use 'gson' to do all the work

以下のカスタム シリアライザーのコードは、思いつきで書いたものです。例外処理が行われず、コンパイルされない可能性があり、インスタンスをGson繰り返し作成するなどの処理が遅くなります。しかし、それはあなたがやりたいことの種類を表しています:

class StepSerializer implements JsonSerializer<Step>
{
  public JsonElement serialize (Step src,
                                Type typeOfSrc,
                                JsonSerializationContext context)
    {
      Gson gson = new Gson ();
      /* Whenever Step is serialized,
      serialize the contained Data correctly.  */
      JsonObject step = new JsonObject ();
      step.add ("start_name", gson.toJsonTree (src.start_name);
      step.add ("end_name",   gson.toJsonTree (src.end_name);

      /* Notice how I'm digging 2 levels deep into 'data.' but adding
      JSON elements 1 level deep into 'step' itself.  */
      step.add ("duration",   gson.toJsonTree (src.data.duration);
      step.add ("distance",   gson.toJsonTree (src.data.distance);
      step.add ("location",   gson.toJsonTree (src.data.location);

      return step;
    }
}
于 2012-06-05T15:12:35.460 に答える
0

gsonでそれを行うための美しい方法はないと思います。たぶん、最初のjsonからjavaオブジェクト(マップ)を取得し、データを削除し、期間を設定して、jsonにシリアル化します。

Map initial = gson.fromJson(initialJson);

// Replace data with duration in this map
Map converted = ...

String convertedJson = gson.toJson(converted);
于 2012-06-05T14:34:30.993 に答える