Java 如何从Json文件中获取值

Java 如何从Json文件中获取值,java,android,json,api,gson,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":"...

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

假设您试图找到
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){

}

假设您正在尝试查找
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反序列化到您的模型中。 您的模型如下所示:

public class MyResponseModel {

    @SerializedName("par_a")
    private String parameterA;
    @SerializedName("par_b")
    private List<AnotherModel> parametersB;
    /.../
}
公共类MyResponseModel{
@序列化名称(“par_a”)
私有字符串参数;
@序列化名称(“par_b”)
私有列表参数b;
/.../
}

一个很好的解决方法是创建一个与您从服务器收到的响应相对应的模型,并使用库轻松地将json反序列化到您的模型中。 您的模型如下所示:

public class MyResponseModel {

    @SerializedName("par_a")
    private String parameterA;
    @SerializedName("par_b")
    private List<AnotherModel> parametersB;
    /.../
}
公共类MyResponseModel{
@序列化名称(“par_a”)
私有字符串参数;
@序列化名称(“par_b”)
私有列表参数b;
/.../
}
如果您从json文件获取数据并将其存储在项目中,那么 您的解决方案就在这里。

在这里,如果您的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,那么请粘贴示例数据json并获取pojo结构。谢谢你的阅读

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

在这里,如果您的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,那么请粘贴示例数据json并获取pojo结构。感谢您的阅读。

您有一个很好的库,可以使用GSON lib。您只需创建一个表示Json文件的对象,当您解码它时,它就会感觉到您的对象和Json数据

如果您有一个优秀的库来实现这一点,请使用GSON lib。您只需创建一个表示Json文件的对象,当您解码它时,它就会感觉到您的对象和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;
}
然后解析json

        JSONObject obj = new JSONObject(loadJSONFromAsset());
这样

    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());
  • 为android studio安装DTO生成器插件(“这对将来的工作也很有用”):文件->设置->插件->搜索DTO并安装
  • 创建一个简单的类,比如DataRetriever。将光标放在该类中,然后按Alt+insert->select DTO from JSON
  • 在窗口中输入获取的JSON,然后按generate。这将使您的类具有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;
    }
    
    使用mDataRetriever对象和getter方法,您可以使用

    Ex : mDataRetriever.getmPar_a()for value “par_a”
    
  • 为android studio安装DTO生成器插件(“这对将来的工作也很有用”):文件->设置->插件->搜索DTO并安装
  • 创建一个简单的类,比如DataRetriever。将光标放在该类中,然后按Alt+insert->select DTO from JSON
  • 在窗口中输入获取的JSON,然后按generate。这将使您的类具有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;
    }
    
    使用mDataRetriever对象和getter方法,您可以使用

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


  • 您需要哪个值?@GourangoSutradhar感谢您的回复。我需要得到所有的值,因为它们将在某个时间点被我使用,如果不是全部的话。如果可能的话,以一种结构化的方式(如java类)获取它们会更好。您尝试过使用DTO生成器吗?使用DTO,您可以将json转换为Gson类。这样您就可以直接从该类获取属性了。@PoojaRajendranC谢谢您的评论。您的回答已经回复。您需要哪个值?@GourangoSutradhar感谢您的回复。我需要得到所有的值,因为它们将在某个时间点被我使用,如果不是全部的话。如果可能的话,以一种结构化的方式(如java类)获取它们会更好。您尝试过使用DTO生成器吗?使用DTO,您可以将json转换为Gson类。这样您就可以直接从该类获取属性了。@PoojaRajendranC谢谢您的评论。我已经回复了你的答案。答案完全是硬编码的。当JSON发生变化时,它会崩溃,而且对象的解析是模糊和不清楚的。是的,我知道。但他太新了,无法清楚地理解json。所以我把它硬编码了,因为他能理解正在发生的事情。了解一下杰索纳瑞和jsobobject@ShamsulArefinSajib非常感谢你的回答。您的回答是帮助我理解JSON概念的唯一答案。请忽略其他评论。回答得很好。再次感谢。你能帮我把b11-1物体也拿出来吗。我认为b11-1是一个数组。如果我错了,请更正。是
    b11-1
    是一个数组。将
    getJSONObject(“b_10”)
    替换为
    getJsonArray(“b_11”)
    ,然后从数组中获取对象。不客气:)答案完全是硬编码的。当JSON发生变化时,它会崩溃,而且对象的解析是模糊和不清楚的。是的,我知道。但他太新了,无法清楚地理解json。所以我把它硬编码了,因为他能理解正在发生的事情。你知道些什么吗