android - 尝试正确提取值但遇到问题
问题描述
我很难让我的代码有效地获取值。
{
"Members": {
"Member": {
"@First_Id": "000",
"@Second_Id": "000",
"@Third_Id": "000",
"@Fourth_Id": "000",
"DisplayAs": "Title FirstName LastName",
"ListAs": "LastName, Title FirstName",
"FullTitle": "Title Title FirstName LastName Title",
"PreviousName": null,
"DateOfBirth": "2020-01-01T00:00:00",
"DateOfDeath": {
"@xsi:nil": "true",
"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
},
"Gender": "M OR F",
"Party": {
"@Id": "4",
"#text": "Party Name"
},
"House": "House Name",
"MemberFrom": "Area Name",
"HouseStartDate": "2020-01-01T00:00:00",
"HouseEndDate": {
"@xsi:nil": "true",
"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
},
"CurrentStatus": {
"@Id": "0",
"@IsActive": "True",
"Name": "Current Member",
"Reason": null,
"StartDate": "2020-01-01T00:00:00"
},
"Addresses": {
"Address": [
{
"@Type_Id": "6",
"Type": "Website",
"IsPreferred": "False",
"IsPhysical": "False",
"Note": null,
"Address1": "https://www.example.co.uk"
},
{
"@Type_Id": "1",
"Type": "Address1",
"IsPreferred": "False",
"IsPhysical": "True",
"Note": null,
"Address1": "Line 1",
"Address2": "Line 2",
"Address3": "Line 3",
"Address4": null,
"Address5": "County Name",
"Postcode": "Postcode",
"Phone": "000 0000 000",
"Fax": "000 0000 000",
"Email": "example@email.co.uk",
"OtherAddress": null
},
{
"@Type_Id": "7",
"Type": "Twitter",
"IsPreferred": "False",
"IsPhysical": "False",
"Note": null,
"Address1": "https://twitter.com/twitter_name"
},
{
"@Type_Id": "4",
"Type": "Address2",
"IsPreferred": "False",
"IsPhysical": "True",
"Note": null,
"Address1": "Line1",
"Address2": "Line2",
"Address3": "Line3",
"Address4": "Line4",
"Address5": null,
"Postcode": "Postcode",
"Phone": "0000 000 000",
"Fax": null,
"Email": "example2@email.co.uk",
"OtherAddress": null
}
]
},
"PrimaryPosts": {
"PrimaryPost": [
{
"@Id": "000",
"Name": "Name",
"ProperName": "The Name",
"StartDate": "2020-01-01T00:00:00",
"EndDate": "2020-01-01T00:00:00",
"Note": null,
"EndNote": null,
"IsJoint": "False",
"IsUnpaid": "False",
"Email": null,
"FormerName": "Name"
},
{
"@Id": "000",
"Name": "Name",
"ProperName": "The Name",
"StartDate": "2020-01-01T00:00:00",
"EndDate": "2020-01-01T00:00:00",
"Note": null,
"EndNote": null,
"IsJoint": "False",
"IsUnpaid": "False",
"Email": null,
"FormerName": "Name"
}
]
},
"FormerPosts": {
"FormerPost": [
{
"@Id": "000",
"Name": "Name",
"ProperName": "The Name",
"StartDate": "2020-01-01T00:00:00",
"EndDate": "2020-01-01T00:00:00",
"Note": null,
"EndNote": null,
"IsJoint": "False",
"IsUnpaid": "False",
"Email": null
},
{
"@Id": "000",
"Name": "Name",
"ProperName": "The Name",
"StartDate": "2020-01-01T00:00:00",
"EndDate": "2020-01-01T00:00:00",
"Note": null,
"EndNote": null,
"IsJoint": "False",
"IsUnpaid": "False",
"Email": null
}
]
},
"BiographyEntries": {
"BiographyEntry": [
{
"@Category_Id": "1",
"Category": "Interest 1",
"Entry": "Value1, Value2, Value3, Value4"
},
{
"@Category_Id": "2",
"Category": "Interest 2",
"Entry": "Value1, Value2, Value3, Value4"
}
]
}
}
}
}
到目前为止,我已经能够解析大部分数据,但认为有一种更好的方法可以在不获取大量错误信息的情况下提取它。有没有办法通过识别他们的@Type_Id 来解析 Json 数组中的信息?
例如,仅通过查找类型 ID 来返回电话、Twitter URL、网站 URL 和电子邮件?
private void jsonParse() {
final String postcode = userPostcode.getText().toString().trim();
String lookupUrl = "https://example/example/example" + postcode + "example/example/example";
final String imageURL = "https://example/example/example";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, lookupUrl, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
JSONObject members = null;
try {
members = response.getJSONObject("Members");
JSONObject member = members.getJSONObject("Member");
String firstID = String.valueOf(member.getInt("@First_Id"));
String areaName = member.getString("MemberFrom");
String name = member.getString("DisplayAs");
String partyName = partyOf.getString("#text");
String mpGender = member.getString("Gender");
String mpDOB = member.getString("DateOfBirth");
String mpFrom = member.getString("HouseStartDate");
String mpImageURL = imageURL + mpID + "/";
JSONObject partyOf = member.getJSONObject("Party");
JSONObject addresses = member.getJSONObject("Addresses");
JSONArray addressesArray = addresses.getJSONArray("Address");
for (int i = 0; i < addressesArray.length(); i++) {
try {
JSONObject addressObjects = addressesArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
}
JSONObject primaryPosts = member.getJSONObject("PrimaryPosts");
JSONArray primaryPostsArray = primaryPosts.getJSONArray("PrimaryPost");
for (int i = 0; i < primaryPostsArray.length(); i++) {
try {
JSONObject primiaryPostObjects = primaryPostsArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
}
JSONObject formerPosts = member.getJSONObject("FormerPosts");
JSONArray formerPostsArray = formerPosts.getJSONArray("FormerPost");
for (int i = 0; i < formerPostsArray.length(); i++) {
try {
JSONObject formerPostsObject = formerPostsArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
}
JSONObject biographyEntries = member.getJSONObject("BiographyEntries");
JSONArray BiographyEntriesArray = biographyEntries.getJSONArray("BiographyEntry");
for (int i = 0; i < BiographyEntriesArray.length(); i++) {
try {
JSONObject biographyEntriesPostsObject = BiographyEntriesArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("Error", "onErrorResponse: " + error.getMessage());
error.printStackTrace();
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("Content-Type", "application/json");
return params;
}
};
mQueue.add(request);
}
解决方案
为了不被数据流量和代码清晰度所淹没,您可以使用这种网站来生成您的 java 模型:jsonschema2pojo
然后,您只需将您的 JSON 代码粘贴到其中,输入您的包名称并在“Source Type”中选择 JSON,然后您可以选择以 zip 格式下载 Java 模型或直接查看结果。
如果您从网络调用中获取此 JSON,则应考虑尝试使用 Retrofit 库,用它解析数据要简单得多(使用 Retrofit Scalar-Converter,您甚至可以自动完成解析并直接获取字符串在回复中)。
我希望这对您有所帮助,让我们知道事情的进展。
推荐阅读
- c# - 如何从列表字符串中获取在两个节点之间只有一个分支的树结构的每个路径c#
- c++ - 调试三重故障
- c++ - C++ DXVA 库“操作失败,因为 DDC/CI 消息在其命令字段中具有无效值。”
- vba - 复制一列中包含内容的单元格然后移动到下一列我确定使用 VBA
- javascript - Node.js 脚本似乎是同步的,即使我希望它是异步的?
- python - 添加到帖子的评论:找不到页面 (404)
- sql - 应用于表单的动态构建标准
- angular - 如何在角度的特定位置调用另一个内部的组件
- vue.js - 左边的标志,右边的表格
- python - python pandas read_excel:sep参数可用?