如何从Json文件中获取价值

时间:2018-12-04 09:12:22

标签: java android json api gson

我正在从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格式,因此没有解决方案对我有用。

6 个答案:

答案 0 :(得分:1)

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

python setup.py develop --uninstall

答案 1 :(得分:1)

  

如果您从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结构。谢谢您的阅读。

答案 2 :(得分:1)

您有一个出色的库,请使用GSON lib。您只需要创建一个代表您的Json文件的对象,当您对其进行解码时,它就会通过json数据来感觉到您的对象!

答案 3 :(得分:1)

使用这种方式

$WD

然后解析json

    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;
}

答案 4 :(得分:1)

  1. 安装适用于android studio的DTO生成器插件(“这对于以后的工作也将是有用的”)。 :文件->设置->插件->搜索DTO并安装
  2. 创建一个简单的类,说DataRetriever。将光标放在该类中,然后按Alt + insert->从JSON中选择DTO
  3. 在窗口中输入获取的JSON,然后按generate。这将使您的类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”
    

答案 5 :(得分:-1)

假设您要查找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){

}