Json, Java, Parsing(如何只获取json的一部分

Posted

技术标签:

【中文标题】Json, Java, Parsing(如何只获取json的一部分【英文标题】:Json, Java, Parsing (How to get only a part of json 【发布时间】:2018-08-17 10:05:49 【问题描述】:

我需要接收以下 Json 的“提取”部分: https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=turkey

使用我当前的代码,我收到了整个 Json 并且真的不知道如何继续:

public class MainActivity extends AppCompatActivity 
private Button btnSendRequest;
private TextView tvText;
private RequestQueue mRequestQueue;
private StringRequest stringRequest;
private JsonObjectRequest jsonObjectRequest;
private String url = "https://de.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=ilmenau";

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnSendRequest = (Button) findViewById(R.id.btnSendRequest);
    tvText = (TextView) findViewById(R.id.tvText);

    btnSendRequest.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            //send request and print the response using volley library
            sendRequestAndPrintResponse();
        
    );

private void sendRequestAndPrintResponse() 

    mRequestQueue = Volley.newRequestQueue(this);

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (Request.Method.GET, url, null, new Response.Listener<JSONObject>() 
        @Override
        public void onResponse(JSONObject response) 
            tvText.setText("Response : " + response.toString());
          //  Log.i(TAG,"Response : " + response.toString());
        
    , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 

            tvText.setText("Error : " + error.toString());
            //Log.i(TAG,"Error : " + error.toString());
        
    );
    mRequestQueue.add(jsonObjectRequest);

所以目前我正在取回整个 Json,但我只需要获取 Json 的“提取”部分。 谁能帮我?

【问题讨论】:

欢迎来到 Stack Overflow!不幸的是,您的问题归结为“有人请帮我解决这个问题”。但我们不将此类请求视为本网站范围内的问题。请仔细阅读this 以了解原因。你应该做什么:阅读minimal reproducible example 并清楚地描述什么不起作用。关键是:您想要访问 JSON 字符串的某个子元素。这是有许多现有答案的问题。那么哪个部分不适合您? 除此之外:而不是链接到外部站点(在某些时候可能会中断):在此问题中包含该 JSON 的 相关 部分(可能是简化的示例) . 看看JSONObject documentation。具体来说,getJSONObject. 好的,感谢您的链接。我想我的问题可以在一分钟内解决,如果你知道怎么做的话。我将阅读链接,然后尝试提出更好的问题。祝你有美好的一天:) 【参考方案1】:

试试这个

try 
    JSONObject jsonObject = new JSONObject(response.toString());
    Iterator < String > keys = jsonObject.keys();

    while (keys.hasNext()) 

        String key = keys.next();
        String value = jsonObject.getString(key);

        Log.v("key", key);
        Log.v("value", value);

        if (key.equals("query")) 
            JSONObject jsonObject1 = new JSONObject(jsonObject.getString(key));
            Iterator < String > keysinner = jsonObject1.keys();

            while (keysinner.hasNext()) 
                String key1 = keysinner.next();
                String value1 = jsonObject1.getString(key1);

                Log.e("key1", key1);
                Log.e("value1", value1);

                if (key1.equals("pages")) 
                    JSONObject jsonObject2 = new JSONObject(jsonObject1.getString(key1));
                    Iterator < String > keyPagenumber = jsonObject2.keys();

                    while (keyPagenumber.hasNext()) 

                        String keyPageNumber = keyPagenumber.next();
                        String valuePagenumber = jsonObject2.getString(keyPageNumber);

                        Log.e("Pages key   :", keyPageNumber);
                        Log.e("Pages value :", valuePagenumber);

                        if (key1.equals("pages")) 
                            JSONObject jsonObjectPages = new JSONObject(jsonObject2.getString(keyPageNumber));
                            Iterator < String > keyPages = jsonObjectPages.keys();

                            while (keyPages.hasNext()) 
                                String keyPageDetail = keyPages.next();
                                String valuePageDetail = jsonObjectPages.getString(keyPageDetail);

                                Log.e("PagesDetail key   :", keyPageDetail);
                                Log.e("PagesDetail value :", valuePageDetail);

                            
                        
                    
                
            
        
    
 catch (Exception e) 
    e.printStackTrace();

输出

【讨论】:

【参考方案2】:

使用 GSON 库!

假设您将jsonObjectRequest 的整个json 内容推断为一个字符串,我将其命名为theWholeContentOfYourJsonObjectRequestAsAString

JsonParser parser = new JsonParser();
JsonElement jsonTree = parser.parse(theWholeContentOfYourJsonObjectRequestAsAString);
JsonObject jsonObject = jsonTree.getAsJsonObject();
JsonElement f1 = jsonObject.get("extract");

【讨论】:

当相关数据已经以 androidJSONObject 的形式呈现时,为什么还要使用 GSON?【参考方案3】:

类似

JSONObject pages = response.getJSONObject("query").getJSONObject("pages");
JSONObject firstPage = pages.getJSONObject(pages.names().get(0));
String extract = firstPage.getString("extract");

应该可以。

【讨论】:

【参考方案4】:

要提取一段 JSON 对象(另一个 JSON 对象、整数、字符串等),您不必使用任何外部库,如 GSON。 您可以使用以下代码对其进行管理。

   JSONObject jObj = new JSONObject(response);                     
   String InterestString = jObj.getJSONObject("local").getString("interests");

【讨论】:

【参考方案5】:

私人无效 sendRequestAndPrintResponse()

    mRequestQueue = Volley.newRequestQueue(this);

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (Request.Method.GET, url, null, new Response.Listener<JSONObject>() 
                @Override
                public void onResponse(JSONObject response) 
                    try 
                        JSONObject query = response.getJSONObject("query");
                        JSONObject pages = query.getJSONObject("pages");
                        JSONObject nos = pages.getJSONObject("11125639");
                        String extract = nos.getString("extract");
                        Log.e(TAG, "onResponse: " + extract);

                     catch (JSONException e) 
                        e.printStackTrace();
                    
                
            , new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 

                    tvText.setText("Error : " + error.toString());
                    //Log.i(TAG,"Error : " + error.toString());
                
            );
    mRequestQueue.add(jsonObjectRequest);

修改你的代码,像这样添加这些行,你应该得到提取

【讨论】:

以上是关于Json, Java, Parsing(如何只获取json的一部分的主要内容,如果未能解决你的问题,请参考以下文章

jackson 序列化忽略未知字段: How to Ignore Unknown Properties While Parsing JSON in Java

Android Retrofit Json Parsing(部分json动态)

[vue/no-parsing-error] Parsing error: x-invalid-end-tag 提示报错

[vue/no-parsing-error] Parsing error: x-invalid-end-tag 提示报错

Unexpected end of JSON input while parsing near

Objc live Json Parsing Only 显示 1 项错误