You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:01:16