Как получить значение из файла Json - PullRequest
0 голосов
/ 04 декабря 2018

Я получаю Json из API.Проблема в том, что я не имею ни малейшего представления о том, как преобразовать формат 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 голосов
/ 04 декабря 2018
  1. Установите плагин генератора DTO для Android Studio («Это будет полезно и для будущих работ»).: Файл -> Настройки -> Плагины -> Поиск DTO и установка
  2. Создайте простой класс, скажем, DataRetriever.Поместите курсор в этот класс и нажмите Alt + insert -> выберите DTO из JSON
  3. Введите полученный JSON в окне и нажмите Generate.Это сделает ваш класс Gson со всеми атрибутами в Json.Создать геттер и сеттер для атрибутов.Результат будет выглядеть так:

    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 и методы получателя, которые выможно получить значение, используя

    Ex : mDataRetriever.getmPar_a()for value “par_a”
    
0 голосов
/ 04 декабря 2018

Используйте этот способ

    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());
0 голосов
/ 04 декабря 2018

У вас есть отличная библиотека, используйте GSON lib.Вам просто нужно создать объект, представляющий ваш файл Json, и когда вы будете его декодировать, он будет чувствовать ваш объект с вашими данными json!

0 голосов
/ 04 декабря 2018

Если вы получаете данные из файла 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;
    }
}

Если вы получите pojo вашего jsonзатем перейдите к http://www.jsonschema2pojo.org/ и вставьте пример данных JSON и получите структуру pojo.Спасибо, что прочитали.

0 голосов
/ 04 декабря 2018

Хороший обходной путь - создать модель, соответствующую ответу, который вы получаете от сервера, и используя библиотеку GSON , вы можете легко десериализовать json для вашей модели.Ваша модель будет примерно такой:

public class MyResponseModel {

    @SerializedName("par_a")
    private String parameterA;
    @SerializedName("par_b")
    private List<AnotherModel> parametersB;
    /.../
}
0 голосов
/ 04 декабря 2018

Предположим, вы пытаетесь найти строковое значение для 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){

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...