【问题标题】:How to get value from Json file如何从 Json 文件中获取价值
【发布时间】:2018-12-04 09:12:21
【问题描述】:

我正在从 API 中检索 Json。问题是我不知道如何将 Json 格式转换为可能是 java 类的格式,以便我可以使用它来获取预期值。

这是我的示例 Json 格式

{
"par_a":".....",
"par_b": [ {
"b1":".....",
"b2":".....",
"b3":".....",
"b4":".....",
"b5":".....",
"b6":".....",
"b7":".....",
"b8":".....",
"b9":".....",
"b10": { "b10-1":".....", "b10-2":".....", "b10-3":"....." } ,
"b11": { "b11-1": ["....." ], "b11-2": ["....." ] } , 
"b13":"......."
} ] 
}

我无法联系 API 的所有者并了解其工作原理,因此非常感谢任何帮助。

我在网上看过很多帖子,但我没有看到像我这样的 Json 格式,因此没有任何解决方案适合我。

【问题讨论】:

  • 你需要哪个值?
  • @GourangoSutradhar 感谢您的回复。我需要获取所有值,因为如果不是全部,它们将在某个时间点被我使用。如果可能的话,以结构化方式(例如 java 类)获取它们会更好。
  • 你试过使用 DTO 生成器吗?使用 DTO,您可以将 json 转换为 Gson 类。这样您就可以直接从该类中获取属性。
  • @PoojaRajendranC 感谢您的评论。已回复您的回答。

标签: java android json api gson


【解决方案1】:

一个很好的解决方法是创建一个与您从服务器接收到的响应相对应的模型,并使用GSON 库您可以轻松地将 json 反序列化为您的模型。 您的模型将是这样的:

public class MyResponseModel {

    @SerializedName("par_a")
    private String parameterA;
    @SerializedName("par_b")
    private List<AnotherModel> parametersB;
    /.../
}

【讨论】:

  • 感谢您的回答。请您提供更多详细信息,因为像我这样的新开发人员将无法详细了解如何使用 GSON 库。另一个答案对我了解 JSON 的概念以及如何转换它们很有用。无论如何,谢谢。
  • 将 GSON 导入您的项目就像将其粘贴到您的 gradle 文件中一样简单:dependencies { implementation 'com.google.code.gson:gson:2.8.5' }
  • 这里有一个非常有用的 Gson 使用教程:futurestud.io/tutorials/…
【解决方案2】:

如果您从 json 文件中获取数据并将其存储在您的项目中,那么 您的解决方案就在这里。

Gson gson = new Gson();
        String customRatioResponse = LocalUtils.loadJSONFromAsset(getActivity(), "custom_ratio.json"); // here custom_ratio.json is my json file. it's store in assets folder of project
        CustomRatioList getSampleImageResponse = gson.fromJson(customRatioResponse, CustomRatioList.class); // here CustormRatioList is my POJO file
        Log.i(TAG, "getAllCategory() -> Offline list size: " + (getSampleImageResponse.getCustomRatio() != null ? getSampleImageResponse.getCustomRatio().size() : 0));
        return getSampleImageResponse.getCustomRatio();

在这里,如果您的 Json 文件包含太多数据或数据列表,那么它会为您提供 arrayList 类型的数据。

LocalUtils.java

public class LocalUtils {

    public static String loadJSONFromAsset(Context context, String jsonFilePath) {
        String json = null;
        try {
            InputStream is = context.getAssets().open(jsonFilePath);
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            json = new String(buffer, "UTF-8");
        } catch (Throwable e) {
            e.printStackTrace();
            return "";
        }
        return json;
    }
}

如果你能得到你的 json 的 pojo,那么去 http://www.jsonschema2pojo.org/ 粘贴你的示例数据 json 并得到 pojo 结构。感谢您的阅读。

【讨论】:

  • 感谢您的回答。但是您的回答有助于从资产加载文件。但我的 Json 文件/字符串来自 API。我也在搜索获取/读取每个参数中的值。无论如何,谢谢。
【解决方案3】:

你有一个优秀的库来做这件事,使用 GSON 库。您只需要创建一个代表您的 Json 文件的对象,当您对其进行解码时,它会感觉到您的对象与您的 json 数据!

【讨论】:

  • 感谢您的回答。我知道 GSON 库,但不知道它是如何使用的。无论如何谢谢。
【解决方案4】:

这样使用

    public String loadJSONFromAsset() {
    String json = null;
    try {
        InputStream is = getActivity().getAssets().open("filename.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;
}

然后解析json

        JSONObject obj = new JSONObject(loadJSONFromAsset());

【讨论】:

  • 感谢您的回答。但是您的回答有助于从资产加载文件。但我的 Json 文件/字符串来自 API。我也在搜索获取/读取每个参数中的值。无论如何,谢谢。
【解决方案5】:
  1. 为 android studio 安装 DTO 生成器插件(“这对未来的工作也很有用”)。 : 文件 -> 设置 -> 插件 -> 搜索 DTO 并安装
  2. 创建一个简单的类,比如 DataRetriever。将光标放在该类中,然后按 Alt+insert -> 从 JSON 中选择 DTO
  3. 在窗口中输入获取的 JSON,然后按生成。这将使您的类 Gson 具有 Json 中的所有属性。为属性创建 getter 和 setter。结果会是这样的

    public class DataRetriever {
    
    @Expose
    @SerializedName("par_b")
    private List<Par_bEntity> mPar_b;
    @Expose
    @SerializedName("par_a")
    private String mPar_a;
    
    public List<Par_bEntity> getmPar_b() {
    return mPar_b;
    }
    
    public void setmPar_b(List<Par_bEntity> mPar_b) {
    this.mPar_b = mPar_b;
    }
    
    public String getmPar_a() {
    return mPar_a;
    }
    
    public void setmPar_a(String mPar_a) {
    this.mPar_a = mPar_a;
    }
    /**
     * Similar to these getter and setter, you can add getter and setter for sub 
     classes also
     */
      }
    
      class Par_bEntity {
    
       @Expose
    @SerializedName("b13")
    private String mB13;
    @Expose
    @SerializedName("b11")
    private B11Entity mB11;
    @Expose
    @SerializedName("b10")
    private B10Entity mB10;
    @Expose
    @SerializedName("b9")
    private String mB9;
    @Expose
    @SerializedName("b8")
    private String mB8;
    @Expose
    @SerializedName("b7")
    private String mB7;
    @Expose
    @SerializedName("b6")
     private String mB6;
    @Expose
    @SerializedName("b5")
    private String mB5;
    @Expose
    @SerializedName("b4")
    private String mB4;
    @Expose
    @SerializedName("b3")
    private String mB3;
    @Expose
    @SerializedName("b2")
    private String mB2;
    @Expose
    @SerializedName("b1")
    private String mB1;
    }
    
    class B10Entity {
       @Expose
      @SerializedName("b10-3")
     private String b10_3;
     @Expose
     @SerializedName("b10-2")
     private String b10_2;
      @Expose
     @SerializedName("b10-1")
      private String b10_1;
      }
    
      class B11Entity {
     @Expose
     @SerializedName("b11-2")
     private List<String> b11_2;
     @Expose
     @SerializedName("b11-1")
     private List<String> b11_1;
    }
    
  4. 在获取json字符串的地方调用DataRetriever类获取值

    DataRetriever mDataRetriever = new Gson().fromJson(jsonString, DataRetriever.class);
    

    使用 mDataRetriever 对象和 getter 方法可以检索值

    Ex : mDataRetriever.getmPar_a()for value “par_a”
    

【讨论】:

  • 感谢您的回答。但不知何故,我无法安装插件。尝试了两次,但都是安装时间,但是在重新启动 Android Studio 时,它是如何被卸载的。无论如何,谢谢。
【解决方案6】:

假设您正在尝试查找 b10-1 的字符串值:

代码如下:

String json = "{par_a:.....,par_b: [ {b1:.....,b2:.....,b3:.....,b4:.....,b5:.....,b6:.....,b7:.....,b8:.....,b9:.....,b10: { b10-1:....., b10-2:....., b10-3:..... } ,b11: { b11-1: [..... ], b11-2: [..... ] } , b13:.......} ]}";

try{
    String result = new JSONObject(json).getJSONArray("par_b").getJSONObject(0).getJSONObject("b_10").getString("b10-1");
}catch(Exception e){

}

【讨论】:

  • 答案是完全硬编码的。它会中断,当 JSON 发生变化时,对象的解析也是模糊不清的。
  • 是的,我知道。但是他太新了,无法清楚地了解 json。所以我对它进行了硬编码,因为他可以理解正在发生的事情。并且知道一些关于 jsonarray 和 jsobobject
  • @ShamsulArefinSajib Thnak 非常感谢您的回答。您的回答是帮助我理解 JSON 概念的唯一答案。请忽略其他 cmets。很棒的答案。再次感谢。
  • 能否请您也帮我获取 b11-1 对象。我认为 b11-1 是一个数组。如果我错了,请纠正。
  • 是的 b11-1 是一个数组。将getJSONObject("b_10") 替换为getJsonArray("b_11"'),然后从数组中获取对象。 不客气 :)
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2021-04-24
  • 2019-02-05
  • 2021-09-02
相关资源
最近更新 更多