如何使用JSON取值?如何存储获取到的value供其他代码区域调用?
解答你的两个JSON相关问题
问题1:如何使用JSON获取值?
咱们先拆解你给出的这段Android JSON解析代码,看看它是怎么一步步定位到目标value的:
- 第一步:
Log.d("Hot Text:", response.toString());先把整个响应JSON打印出来,这是调试的好习惯,能帮你确认整个JSON的结构是否符合预期。 - 第二步:
JSONArray array = response.getJSONArray("rows");从根JSONObject(这里的response应该是一个JSONObject实例)中取出名为rows的JSON数组。 - 第三步:
JSONObject jsonObject = array.getJSONObject(0);取出rows数组里的第一个元素(下标从0开始),这个元素是一个JSONObject。 - 第四步:
JSONArray a = jsonObject.getJSONArray("elements");从刚才的对象里取出名为elements的另一个JSON数组。 - 第五步:
JSONObject js = a.getJSONObject(0);同样取elements数组的第一个JSONObject。 - 第六步:
JSONObject b = js.getJSONObject("distance");从这个对象里取出嵌套的distance对象。 - 第七步:
value = b.getString("value");最终从distance对象里拿到你要的value字符串,之后打印出来。
需要注意的是:这段代码依赖于固定的JSON结构,如果实际返回的JSON里rows/elements数组为空,或者键名拼写错误(比如把distance写成distence),就会抛出JSONException,所以代码里的异常捕获块很重要,能避免APP崩溃。
问题2:如何将获取到的"value"存储起来,供其他代码区域使用?
根据你的使用场景不同,有几种常见的方案:
1. 类成员变量(同一类内复用)
如果只是在当前类的其他方法里使用这个value,最简单的方式是把它定义成类的成员变量:
public class YourActivity extends AppCompatActivity { // 声明成员变量 private String distanceValue; // 你的解析方法 private void parseJson(JSONObject response) { try { // ... 省略中间解析步骤 ... distanceValue = b.getString("value"); Log.d("TAG", "title:" + distanceValue); } catch (JSONException e) { e.printStackTrace(); } } // 其他方法里直接使用 private void doSomethingElse() { if (distanceValue != null) { // 用distanceValue做操作 } } }
2. 持久化存储(重启APP仍能获取)
如果需要把这个值保存下来,下次打开APP还能拿到,推荐用SharedPreferences:
// 存储value SharedPreferences sp = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("saved_distance_value", value); // apply()是异步提交,commit()是同步,推荐用apply() editor.apply(); // 其他地方取出值 String savedValue = sp.getString("saved_distance_value", ""); // 第二个参数是默认值
3. 跨页面传递(传给其他Activity/Fragment)
如果要把值传给另一个页面,用Intent传递:
// 当前页面传递 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("KEY_DISTANCE_VALUE", value); startActivity(intent); // 目标页面接收 String receivedValue = getIntent().getStringExtra("KEY_DISTANCE_VALUE");
如果是Fragment之间传递,可以用Bundle或者ViewModel。
4. ViewModel(MVVM架构下跨生命周期复用)
如果你的项目用MVVM架构,或者需要在配置变化(比如屏幕旋转)后仍保留这个值,用ViewModel最合适:
// 定义ViewModel类 public class DistanceViewModel extends ViewModel { private MutableLiveData<String> distanceValue = new MutableLiveData<>(); public void setDistanceValue(String value) { distanceValue.setValue(value); } public LiveData<String> getDistanceValue() { return distanceValue; } } // 在Activity里设置值 DistanceViewModel viewModel = new ViewModelProvider(this).get(DistanceViewModel.class); viewModel.setDistanceValue(value); // 在其他地方(比如另一个Fragment)观察值 viewModel.getDistanceValue().observe(getViewLifecycleOwner(), new Observer<String>() { @Override public void onChanged(String s) { // 拿到更新后的value做操作 } });
内容的提问来源于stack exchange,提问作者F.Chu
相关产品推荐
相关产品推荐

