gson 得到了 com.google.gson.internal.LinkedTreeMap

Vih*_*rma 5 android json gson google-api-client jackson2

我有以下json

{
  "kind": "youtube#channelListResponse",
  "etag": "\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/QM4kW8nb-nymx1biZnF8bIvgOfE\"",
  "pageInfo": {
    "totalResults": 1,
    "resultsPerPage": 1
  },
  "items": [
    {
      "kind": "youtube#channel",
      "etag": "\"cbz3lIQ2N25AfwNr-BdxUVxJ_QY/y82-gQyDEMJUwKI8hgUfyTzHck8\"",
      "id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "snippet": {
        "title": "Google Developers",
        "description": "The Google Developers channel, offers lessons, talks, the latest news & best practices. Learn Android, Chrome,  Web Development, Polymer, Performance, iOS & more!\n\nTake advantage of this resource by subscribing to the official Google Developers channel here: https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw?sub_confirmation=1\n \nFollow Google Developers on Twitter: https://twitter.com/googledevs\n\nFollow Google Developers on Google+: https://plus.google.com/+GoogleDevelopers\n\nCheck out the Google Developers Blog: http://googledevelopers.blogspot.com/",
        "customUrl": "googlecode",
        "publishedAt": "2007-08-23T00:34:43.000Z",
        "thumbnails": {
          "default": {
            "url": "https://yt3.ggpht.com/-Fgp8KFpgQqE/AAAAAAAAAAI/AAAAAAAAAAA/Wyh1vV5Up0I/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
          },
          "medium": {
            "url": "https://yt3.ggpht.com/-Fgp8KFpgQqE/AAAAAAAAAAI/AAAAAAAAAAA/Wyh1vV5Up0I/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
          },
          "high": {
            "url": "https://yt3.ggpht.com/-Fgp8KFpgQqE/AAAAAAAAAAI/AAAAAAAAAAA/Wyh1vV5Up0I/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
          }
        },
        "localized": {
          "title": "Google Developers",
          "description": "The Google Developers channel, offers lessons, talks, the latest news & best practices. Learn Android, Chrome,  Web Development, Polymer, Performance, iOS & more!\n\nTake advantage of this resource by subscribing to the official Google Developers channel here: https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw?sub_confirmation=1\n \nFollow Google Developers on Twitter: https://twitter.com/googledevs\n\nFollow Google Developers on Google+: https://plus.google.com/+GoogleDevelopers\n\nCheck out the Google Developers Blog: http://googledevelopers.blogspot.com/"
        }
      },
      "contentDetails": {
        "relatedPlaylists": {
          "uploads": "UU_x5XG1OV2P6uZZ5FSM9Ttw",
          "watchHistory": "HL",
          "watchLater": "WL"
        }
      },
      "statistics": {
        "viewCount": "123396411",
        "commentCount": "393",
        "subscriberCount": "1239356",
        "hiddenSubscriberCount": false,
        "videoCount": "4514"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要将其保存到共享首选项并稍后返回。

保存json的代码工作正常

public static void addSelectedYoutubeAccounts(Context context, ChannelListResponse response) {
    Gson gson = new Gson();
    SharedPreferences sp = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    String data = response.toString();
    //        data = gson.toJson(response); // didn't work either

    editor.putString(PREF_SELECTED_YOUTBE_ACCOUNTS, data);
    editor.commit();
}
Run Code Online (Sandbox Code Playgroud)

但是当使用以下代码将其返回到 google api 客户端库的 ChannelListResponse 对象时

public static ChannelListResponse getSelectedYoutubeAccounts(Context context) {
    Gson gson = new Gson();
    SharedPreferences sp = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    String data = sp.getString(PREF_SELECTED_YOUTBE_ACCOUNTS, "");
    ChannelListResponse response = gson.fromJson(data, ChannelListResponse.class);

    return response;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下异常

 21:02:24.041 3064-3064/video.uploader8266.testing.debug123 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                   Process: video.uploader8266.testing.debug123, PID: 3064
                                                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{video.uploader8266.testing.debug123/com.example.vihaan.videouploaderfacebook.ui.postPreviewScreen.PostPreviewActivity}: java.lang.IllegalArgumentException: field com.google.api.services.youtube.model.ChannelListResponse.pageInfo has type com.google.api.services.youtube.model.PageInfo, got com.google.gson.internal.LinkedTreeMap
                                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                                       at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                                       at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                                    Caused by: java.lang.IllegalArgumentException: field com.google.api.services.youtube.model.ChannelListResponse.pageInfo has type com.google.api.services.youtube.model.PageInfo, got com.google.gson.internal.LinkedTreeMap
                                                                                       at java.lang.reflect.Field.set(Native Method)
                                                                                       at com.google.api.client.util.FieldInfo.setFieldValue(FieldInfo.java:245)
                                                                                       at com.google.api.client.util.FieldInfo.setValue(FieldInfo.java:206)
                                                                                       at com.google.api.client.util.GenericData.put(GenericData.java:103)
                                                                                       at com.google.api.client.util.GenericData.put(GenericData.java:47)
                                                                                       at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:188)
                                                                                       at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
                                                                                       at com.google.gson.Gson.fromJson(Gson.java:888)
                                                                                       at com.google.gson.Gson.fromJson(Gson.java:853)
                                                                                       at com.google.gson.Gson.fromJson(Gson.java:802)
                                                                                       at com.google.gson.Gson.fromJson(Gson.java:774)
                                                                                       at com.example.vihaan.videouploaderfacebook.util.SharedPreferenceManager.getSelectedYoutubeAccounts(SharedPreferenceManager.java:82)
                                                                                       at com.example.vihaan.videouploaderfacebook.ui.postPreviewScreen.PostPreviewFragment.initYoutubeAccounts(PostPreviewFragment.java:156)
                                                                                       at com.example.vihaan.videouploaderfacebook.ui.postPreviewScreen.PostPreviewFragment.initAccounts(PostPreviewFragment.java:148)
                                                                                       at com.example.vihaan.videouploaderfacebook.ui.postPreviewScreen.PostPreviewFragment.initState(PostPreviewFragment.java:137)
                                                                                       at com.example.vihaan.videouploaderfacebook.ui.postPreviewScreen.PostPreviewFragment.onViewCreated(PostPreviewFragment.java:132)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                                                                                       at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
                                                                                       at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
                                                                                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
                                                                                       at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
                                                                                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
                                                                                       at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221)
                                                                                       at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171)
                                                                                       at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
                                                                                       at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:560)
                                                                                       at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
                                                                                       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
10-23 21:02:24.041 3064-3064/video.uploader8266.testing.debug123 E/AndroidRuntime:     at android.app.Activity.performStart(Activity.java:6696)
                                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2628)
                                                                                        ... 9 more
Run Code Online (Sandbox Code Playgroud)

如何保存对象并正确取回它?