android - 从 Assets 文件夹解析 Json 文件时出现 NullPointerException

标签 android json nullpointerexception

我正在尝试从位于学校项目“ Assets ”文件夹中的 JSON 文件进行解析。我做过一个类似的项目,但我不知道为什么它会返回空指针异常。我知道该错误指出我正在尝试从列表中获取它为空的大小,但我看不到我失败的地方。感谢您对此事的任何帮助,这让我发疯。

我有一个 MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NewsController newsController = new NewsController();
        List<RSSFeedCategory> rssFeedCategories = newsController.getRSSFeedCategoryList(this);
        Integer rssFeedCategoryAmount = rssFeedCategories.size();
    }
}

我有一个对象 RSSFeedCategory:

public class RSSFeedCategory {
    private String categoryName;
    private String objectId;

    public RSSFeedCategory(String categoryName) {
        this.categoryName = categoryName;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public String getObjectId() {
        return objectId;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }
}

我有一个对象容器 RSSFeedCategoryContainer:

public class RSSFeedCategoryContainer {

    private List<RSSFeedCategory> rssFeedCategoryList;

    public void setRssFeedCategoryList(List<RSSFeedCategory> rssFeedCategoryList) {
        this.rssFeedCategoryList = rssFeedCategoryList;
    }

    public List<RSSFeedCategory> getRssFeedCategoryList() {

        return this.rssFeedCategoryList;
    }
}

我有一个新闻 Controller :

public class NewsController {
    public List<RSSFeedCategory> getRSSFeedCategoryList(Context context){
        NewsDAO newsDAO = new NewsDAO();
        return newsDAO.getRSSFeedCategoryList(context);
    }
}

我有一个 GenericDAO:

public class GenericDAO {
    public Object getObjectJSON(Context context, Class aClass, String fileName){

        Object object = null;
        try{

            AssetManager manager = context.getAssets();
            InputStream inputStream = manager.open(fileName);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            Gson gson = new Gson();
            object = gson.fromJson(bufferedReader, aClass);
        }
        catch (Exception e){
            e.printStackTrace();
        }

        return object;
    }
}

我有一个扩展了 GenericDAO 的 NewsDAO:

public class NewsDAO extends GenericDAO {
    public List<RSSFeedCategory> getRSSFeedCategoryList(Context context){
        RSSFeedCategoryContainer rssFeedCategoryContainer = (RSSFeedCategoryContainer) getObjectJSON(context,RSSFeedCategoryContainer.class,"RSSFeedCategory.json");

        return rssFeedCategoryContainer.getRssFeedCategoryList();
    }
}

这是“ Assets ”文件夹中的 RSSFeedCategory.json:

{ "results": [
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Design",
        "createdAt": "2015-02-03T08:55:30.775Z",
        "objectId": "1ezmQEpd1i",
        "updatedAt": "2015-02-03T08:55:30.775Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Technology",
        "createdAt": "2015-02-03T08:55:29.894Z",
        "objectId": "5dBaQy4wpf",
        "updatedAt": "2015-02-03T08:55:29.894Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Music",
        "createdAt": "2015-02-03T08:55:31.560Z",
        "objectId": "73nctHMpkY",
        "updatedAt": "2015-02-03T08:55:31.560Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Business",
        "createdAt": "2015-02-03T08:55:30.465Z",
        "objectId": "C4iDiuriB8",
        "updatedAt": "2015-02-03T08:55:30.465Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Gadgets",
        "createdAt": "2015-02-03T08:55:30.057Z",
        "objectId": "FGTeskscsC",
        "updatedAt": "2015-02-03T08:55:30.057Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Auto",
        "createdAt": "2015-02-03T08:55:32.000Z",
        "objectId": "J2YJqOxGIK",
        "updatedAt": "2015-02-03T08:55:32.000Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Gaming",
        "createdAt": "2015-02-03T08:55:31.405Z",
        "objectId": "J4Oq3C7nxg",
        "updatedAt": "2015-02-03T08:55:31.405Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Social",
        "createdAt": "2015-02-03T08:55:32.170Z",
        "objectId": "N6H0v01tCl",
        "updatedAt": "2015-02-03T08:55:32.170Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Cooking",
        "createdAt": "2015-02-03T08:55:31.849Z",
        "objectId": "XzGdFekl2A",
        "updatedAt": "2015-02-03T08:55:31.849Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Entertainment",
        "createdAt": "2015-02-03T08:55:31.247Z",
        "objectId": "Zk3DzKrF8k",
        "updatedAt": "2015-02-03T08:55:31.247Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Fashion",
        "createdAt": "2015-02-03T08:55:30.934Z",
        "objectId": "ghJX0ATWfq",
        "updatedAt": "2015-02-03T08:55:30.934Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Travel",
        "createdAt": "2015-02-03T08:55:32.487Z",
        "objectId": "hpPkcHkTTV",
        "updatedAt": "2015-02-03T08:55:32.487Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Finance",
        "createdAt": "2015-02-03T08:55:30.621Z",
        "objectId": "nA3FO06l9z",
        "updatedAt": "2015-02-03T08:55:30.621Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Photography",
        "createdAt": "2015-02-03T08:55:31.087Z",
        "objectId": "qC1VFzLgbF",
        "updatedAt": "2015-02-03T08:55:31.087Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "News",
        "createdAt": "2015-02-03T08:55:29.727Z",
        "objectId": "uXFSxpJeDO",
        "updatedAt": "2015-02-03T08:55:29.727Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Sports",
        "createdAt": "2015-02-03T08:55:30.263Z",
        "objectId": "yjHwfD1z3Y",
        "updatedAt": "2015-02-03T08:55:30.263Z"
    },
    {
        "ACL": {
            "*": {
                "read": true
            }
        },
        "categoryName": "Humor",
        "createdAt": "2015-02-03T08:55:32.320Z",
        "objectId": "z8zyfeKhk7",
        "updatedAt": "2015-02-03T08:55:32.320Z"
    }
] }

logcat 错误:

06-26 20:46:35.161 5957-5957/ar.com.thomas.parsetest E/AndroidRuntime: FATAL EXCEPTION: main
   Process: ar.com.thomas.parsetest, PID: 5957
   java.lang.RuntimeException: Unable to start activity ComponentInfo{ar.com.thomas.parsetest/ar.com.thomas.parsetest.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5417)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
       at ar.com.thomas.parsetest.MainActivity.onCreate(MainActivity.java:17)
       at android.app.Activity.performCreate(Activity.java:6237)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

最佳答案

你所要做的就是添加这个注解:

@SerializedName("results")
private List<RSSFeedCategory> rssFeedCategoryList;

到您的 RSSFeedCategoryContainer。没有它,Gson 无法将数组从 json 正确映射到 rssFeedCategoryList 字段

关于android - 从 Assets 文件夹解析 Json 文件时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38044325/

相关文章:

java - Files.createTempDirectory ("") 抛出 NullPointerException

java - getClass().getResource() 仅适用于 Gradle

java - 如何将元素添加到另一个类的列表中?

java - TextureRegion.split Android工作室错误

java - 从自定义按钮android中删除白色背景

javascript - json 值 javascript XDK

javascript - 消除 JSON 对象中的重复项

c# - 在 JSON 中用冒号解析字段名称

android - 如何在 galaxy nexus 中使用手电筒模式?

android - 使用 Kotlin 将自定义属性添加到 android View ?