如何解析JSON字符串并将用户数据展示到APP的TextView中
嘿,我来帮你搞定这个把JSON解析后的用户数据展示到TextView的需求!针对你给出的这段JSON,我给你两种常用的实现方式,你可以根据自己的情况选:
方法一:使用Android原生JSON API(无需第三方库)
如果不想引入额外的库,用系统自带的JSONArray和JSONObject就可以搞定,步骤很清晰:
- 先把你的JSON字符串解析成
JSONArray(因为最外层是数组格式) - 从数组里取出第一个用户对象(你的示例里只有一个用户)
- 逐个提取字段,包括嵌套的
address和company里的内容 - 把这些内容拼接成易读的格式,最后设置到TextView里
直接上代码,带注释很容易看懂:
// 假设你已经拿到了目标JSON字符串,存在jsonStr变量里 String jsonStr = "[{ \"id\": 1, \"name\": \"Leanne Graham\", \"username\": \"Bret\", \"email\": \"Sincere@april.biz\", \"address\": { \"street\": \"Kulas Light\", \"suite\": \"Apt. 556\", \"city\": \"Gwenborough\", \"zipcode\": \"92998-3874\", \"geo\": { \"lat\": \"-37.3159\", \"lng\": \"81.1496\" } }, \"phone\": \"1-770-736-8031 x56442\", \"website\": \"hildegard.org\", \"company\": { \"name\": \"Romaguera-Crona\", \"catchPhrase\": \"...\" } }]"; TextView userInfoTv = findViewById(R.id.user_info_text_view); try { // 解析成JSON数组 JSONArray jsonArray = new JSONArray(jsonStr); // 取出数组中的第一个用户对象 JSONObject userObj = jsonArray.getJSONObject(0); // 提取基础用户字段 int id = userObj.getInt("id"); String name = userObj.getString("name"); String username = userObj.getString("username"); String email = userObj.getString("email"); String phone = userObj.getString("phone"); String website = userObj.getString("website"); // 解析嵌套的地址对象 JSONObject addressObj = userObj.getJSONObject("address"); String street = addressObj.getString("street"); String suite = addressObj.getString("suite"); String city = addressObj.getString("city"); String zipcode = addressObj.getString("zipcode"); // 解析地址里的坐标信息 JSONObject geoObj = addressObj.getJSONObject("geo"); String lat = geoObj.getString("lat"); String lng = geoObj.getString("lng"); // 解析嵌套的公司对象 JSONObject companyObj = userObj.getJSONObject("company"); String companyName = companyObj.getString("name"); String catchPhrase = companyObj.getString("catchPhrase"); // 拼接成用户信息文本 StringBuilder infoBuilder = new StringBuilder(); infoBuilder.append("用户ID: ").append(id).append("\n") .append("姓名: ").append(name).append("\n") .append("用户名: ").append(username).append("\n") .append("邮箱: ").append(email).append("\n") .append("地址: ").append(street).append(" ").append(suite).append(", ").append(city).append(" ").append(zipcode).append("\n") .append("坐标: ").append(lat).append(", ").append(lng).append("\n") .append("电话: ").append(phone).append("\n") .append("网站: ").append(website).append("\n") .append("公司: ").append(companyName).append("\n") .append("公司标语: ").append(catchPhrase); // 将拼接好的文本设置到TextView userInfoTv.setText(infoBuilder.toString()); } catch (JSONException e) { // 处理解析异常,比如JSON格式错误、字段缺失等情况 e.printStackTrace(); userInfoTv.setText("解析用户数据失败"); }
方法二:使用Gson库(更简洁,适合复杂JSON结构)
如果你的JSON结构以后可能更复杂,或者想写更简洁的代码,Google的Gson库是个好选择,步骤如下:
第一步:添加Gson依赖
在你的app模块的build.gradle文件的dependencies块里添加:
implementation 'com.google.code.gson:gson:2.10.1' // 可以用最新版本
第二步:创建对应的数据实体类
根据JSON结构创建四个实体类,字段名要和JSON里的完全对应(或者用@SerializedName注解映射不同的字段名):
// 用户实体类 public class User { private int id; private String name; private String username; private String email; private Address address; private String phone; private String website; private Company company; // 生成所有字段的getter和setter方法,这里省略部分示例 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } } // 地址实体类 public class Address { private String street; private String suite; private String city; private String zipcode; private Geo geo; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public Geo getGeo() { return geo; } public void setGeo(Geo geo) { this.geo = geo; } // 其他字段的getter/setter自行补充 } // 坐标实体类 public class Geo { private String lat; private String lng; public String getLat() { return lat; } public void setLat(String lat) { this.lat = lat; } public String getLng() { return lng; } public void setLng(String lng) { this.lng = lng; } } // 公司实体类 public class Company { private String name; private String catchPhrase; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCatchPhrase() { return catchPhrase; } public void setCatchPhrase(String catchPhrase) { this.catchPhrase = catchPhrase; } }
第三步:解析JSON并展示
用Gson把JSON字符串直接转成实体类对象,然后提取数据展示:
String jsonStr = "[{ \"id\": 1, \"name\": \"Leanne Graham\", \"username\": \"Bret\", \"email\": \"Sincere@april.biz\", \"address\": { \"street\": \"Kulas Light\", \"suite\": \"Apt. 556\", \"city\": \"Gwenborough\", \"zipcode\": \"92998-3874\", \"geo\": { \"lat\": \"-37.3159\", \"lng\": \"81.1496\" } }, \"phone\": \"1-770-736-8031 x56442\", \"website\": \"hildegard.org\", \"company\": { \"name\": \"Romaguera-Crona\", \"catchPhrase\": \"...\" } }]"; TextView userInfoTv = findViewById(R.id.user_info_text_view); try { Gson gson = new Gson(); // 因为JSON是数组,所以解析成User数组 User[] users = gson.fromJson(jsonStr, User[].class); // 取第一个用户 User user = users[0]; // 拼接用户信息文本 StringBuilder infoBuilder = new StringBuilder(); infoBuilder.append("用户ID: ").append(user.getId()).append("\n") .append("姓名: ").append(user.getName()).append("\n") .append("用户名: ").append(user.getUsername()).append("\n") .append("邮箱: ").append(user.getEmail()).append("\n") .append("地址: ").append(user.getAddress().getStreet()).append(" ").append(user.getAddress().getSuite()) .append(", ").append(user.getAddress().getCity()).append(" ").append(user.getAddress().getZipcode()).append("\n") .append("坐标: ").append(user.getAddress().getGeo().getLat()).append(", ").append(user.getAddress().getGeo().getLng()).append("\n") .append("电话: ").append(user.getPhone()).append("\n") .append("网站: ").append(user.getWebsite()).append("\n") .append("公司: ").append(user.getCompany().getName()).append("\n") .append("公司标语: ").append(user.getCompany().getCatchPhrase()); userInfoTv.setText(infoBuilder.toString()); } catch (Exception e) { e.printStackTrace(); userInfoTv.setText("解析用户数据失败"); }
一些小提示
- 不管用哪种方法,一定要加异常处理,避免因为JSON格式错误、字段缺失导致APP崩溃
- 如果你的JSON数组里可能有多个用户,记得用循环遍历数组,不要直接取第一个元素
- 用Gson时,如果实体类字段名和JSON字段名不一样,可以用
@SerializedName("json字段名")注解来映射,比如@SerializedName("catch_phrase") private String catchPhrase;
内容的提问来源于stack exchange,提问作者gwarrior
相关产品推荐
相关产品推荐

