【问题标题】:gson.fromJson StackOverFlowErrorgson.fromJson StackOverFlowError
【发布时间】:2015-10-29 08:47:35
【问题描述】:

我不知道为什么它不起作用,我认为我做对了。

错误

10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime: FATAL EXCEPTION: main
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime: Process: com.imaginarv.launcher, PID: 11957
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime: java.lang.StackOverflowError
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
10-29 09:22:48.995 11957-11957/com.imaginarv.launcher E/AndroidRuntime:     at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)

apps.json

此文件存储在 assets/apps.json 中。 我在http://jsonviewer.stack.hu/.上查过了

[
  {
    "name": "Carpeta 1",
    "packages": [
      "com.mobilendo.app1",
      "com.mobilendo.app2"
    ]
  },
  {
    "name": "Carpeta 2",
    "packages": [
      "com.mobilendo.app1",
      "com.mobilendo.app2"
    ]
  }
]

功能

从 apps.json 读取 JSon 并解析它的函数。

private ArrayList<FolderModel> getFolders() {
    String jsonString = loadJSONFromAsset();
    Gson gson = new Gson();
    ArrayList<FolderModel> foldersList;
    foldersList = gson.fromJson(jsonString, new TypeToken<ArrayList<FolderModel>>(){}.getType());

    return foldersList;
}

public String loadJSONFromAsset() {
    StringBuilder buf = new StringBuilder();
    try {
        InputStream json = getAssets().open("apps.json");
        BufferedReader in = new BufferedReader(new InputStreamReader(json, "UTF-8"));
        String str;
        while ((str = in.readLine()) != null) {
            buf.append(str);
        }
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    return buf.toString();
}

文件夹模型

public class FolderModel {
    @SerializedName("name")
    private String name;

    @SerializedName("packages")
    private ArrayList<String> packages;

    @SerializedName("apps")
    private ArrayList<AppModel> apps;

    @SerializedName("icon")
    private Drawable icon;

    public FolderModel(String name, ArrayList<String> packages) {
        this.name = name;
        this.packages = packages;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<String> getPackages() {
        return packages;
    }

    public void setPackages(ArrayList<String> packages) {
        this.packages = packages;
    }

    public ArrayList<AppModel> getApps() {
        return apps;
    }

    public void setApps(ArrayList<AppModel> apps) {
        this.apps = apps;
    }

    public Drawable getIcon() {
        return icon;
    }

    public void setIcon(Drawable icon) {
        this.icon = icon;
    }
}

应用模型

public class AppModel implements Serializable {
    private final Context mContext;
    private final ApplicationInfo mInfo;

    private String mAppLabel;
    private Drawable mIcon;

    private boolean mMounted;
    private final File mApkFile;

    public AppModel(Context context, ApplicationInfo info) {
        mContext = context;
        mInfo = info;

        mApkFile = new File(info.sourceDir);
    }

    public ApplicationInfo getAppInfo() {
        return mInfo;
    }

    public String getApplicationPackageName() {
        return getAppInfo().packageName;
    }

    public String getLabel() {
        return mAppLabel;
    }

    public Drawable getIcon() {
        if (mIcon == null) {
            if (mApkFile.exists()) {
                mIcon = mInfo.loadIcon(mContext.getPackageManager());
                return mIcon;
            } else {
                mMounted = false;
            }
        } else if (!mMounted) {
            // If the app wasn't mounted but is now mounted, reload
            // its icon.
            if (mApkFile.exists()) {
                mMounted = true;
                mIcon = mInfo.loadIcon(mContext.getPackageManager());
                return mIcon;
            }
        } else {
            return mIcon;
        }

        return mContext.getResources().getDrawable(android.R.drawable.sym_def_app_icon);
    }


    public void loadLabel(Context context) {
        if (mAppLabel == null || !mMounted) {
            if (!mApkFile.exists()) {
                mMounted = false;
                mAppLabel = mInfo.packageName;
            } else {
                mMounted = true;
                CharSequence label = mInfo.loadLabel(context.getPackageManager());
                mAppLabel = label != null ? label.toString() : mInfo.packageName;
            }
        }
    }
}

【问题讨论】:

  • 不清楚。您能否介绍您要实现的目标,并仅粘贴相关的代码部分,以便 questin 对其他人有用。 stackoverflow.com/help/how-to-ask
  • 能不能发一下AppModel和Drawable
  • 请发布您的 AppModel 课程

标签: java android json gson stack-overflow


【解决方案1】:

从 FolderModel 和 AppModel 中删除 Drawable 对象,并将其保存为 id 或图像 url。 Drawable 不是可序列化的类,将它们保存在内存中的成本很高。

【讨论】:

  • 不工作,只有在没有 AppModel 数组列表和 Drawable 的情况下工作。
  • 是的,我知道,但 GSON 在搜索之前不知道是否有可绘制对象。因此,GSON 中断是因为它搜索了一些可绘制对象。试试看,如果不是问题,我们会寻找其他解决方案
  • 我删除了 Drawable 并且不工作,只有在我删除 Drawable 和 AppModel 时才工作。
  • 是的!这是因为在 AppModel 中你也有一个 Drawable!也尝试将其删除。
  • 有效!谢谢@ezefire
【解决方案2】:

试试这样的:

JSONArray list;
list = new JSONArray(jsonString);
                foldersList = new ArrayList<FolderModel>();
                FolderModel f;
                for (int i = 1; i < list.length(); ++i) {
                    f=new FolderModel();
                    JSONObject obj = list.getJSONObject(i);

                    f.setName(obj.getString("name").toString());
                }

【讨论】:

    【解决方案3】:

    我通常用另一种方式来解析:

     FolderModel[] arrayModels = gson.fromJson(jsonString, FolderModel[].class);
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多