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");
【讨论】:
当相关数据已经以 android 的JSONObject
的形式呈现时,为什么还要使用 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 提示报错