使用索引从 gson 获取值

Get value from gson with index

我正在尝试使用 gson 库解析巨大的 json,我的主要想法是从每个对象中获取一个值并将其保存为字符串。 This 我正在使用的 json 文件。这是我用来解析 json 的代码:

public class PostsActivity extends Activity {

    private static final String TAG = "PostsActivity";
    private List<Post> posts;
    public TextView textss;
    public int i;



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

        textss = (TextView)findViewById(R.id.texts);
        PostFetcher fetcher = new PostFetcher();
        fetcher.execute();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.posts, menu);
        return true;
    }

    private void handlePostsList(List<Post> posts) {
        this.posts = posts;

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                for(Post post : PostsActivity.this.posts) {
                    Toast.makeText(PostsActivity.this, post.title + " " + i, Toast.LENGTH_SHORT).show();


                }
            }
        });
    }

    private void failedLoadingPosts() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                Toast.makeText(PostsActivity.this, "Failed to load Posts. Have a look at LogCat. bls bls bls " , Toast.LENGTH_SHORT).show();
            }
        });
    }


    private class PostFetcher extends AsyncTask<Void, Void, String> {
        private static final String TAG = "PostFetcher";
        public static final String SERVER_URL = "http://kylewbanks.com/rest/posts";

        @Override
        protected String doInBackground(Void... params) {
            try {
                //Create an HTTP client
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(SERVER_URL);

                //Perform the request and check the status code
                HttpResponse response = client.execute(post);
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
                    InputStream content = entity.getContent();

                    try {

                        for ( i = 0; i < 4; i++) {
                            //Read the server response and attempt to parse it as JSON
                            Reader reader = new InputStreamReader(content);

                            GsonBuilder gsonBuilder = new GsonBuilder();

                            gsonBuilder.setDateFormat("M/d/yy hh:mm a");
                            Gson gson = gsonBuilder.create();
                            List<Post> posts = Arrays.asList(gson.fromJson(reader, Post[].class));

                            content.close();
                            handlePostsList(posts);
                        }

                    } catch (Exception ex) {
                        Log.e(TAG, "Failed to parse JSON due to: " + ex);

                        failedLoadingPosts();
                    }
                } else {
                    Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode());

                    failedLoadingPosts();
                }
            } catch(Exception ex) {
                Log.e(TAG, "Failed to send HTTP POST request due to: " + ex);

                failedLoadingPosts();
            }
            return null;
        } 
    }
}

我还在学习,我的理解是所有值都保存在一个大列表中,然后这些值显示在 Toast 中。我想做的是在字符串中保存一个值,就像我用 json 那样:

JSONArray arr = new JSONArray(result);
JSONObject jObj = arr.getJSONObject(0);
String date = jObj.getString("NeededString");

如何使用 Gson 库实现此目的?

这是我试过的你想要的。

//Read the server response and attempt to parse it as JSON
Reader reader = new InputStreamReader(content);

GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.setDateFormat("M/d/yy hh:mm a");
Gson gson = gsonBuilder.create();
//List<Post> posts = Arrays.asList(gson.fromJson(reader, Post[].class));
JsonArray posts = new JsonParser().parse(reader).getAsJsonArray();

// Get first element at index 0
Post post1 = gson.fromJson(posts.get(0).getAsJsonObject(), Post.class);
Log.d(TAG, "post1 .. " + post1.getTitle());
content.close();
//handlePostsList(posts);

首先,我创建了一个Gson JsonArray。并通过创建一个新的 JsonParser 来分配它,它将 reader 解析为 JsonArray.

然后您可以通过获取索引 0 处的元素来提取 posts 的第一个元素,并使用相应的 Object.

进行反序列化

我用 set/get 代替 Post object 所以我得到的标题是 post1.getTitle()

日志显示

post1 .. Disabling Google Analytics in Development Using Only JavaScript