Как получить значение json child в массиве - PullRequest
0 голосов
/ 20 января 2020

Как значение bio и значение ссылки в этом JSON файле на строку, которую я использую android studio

{
  "Amber": [
    {
      "Info": {
        "name": "Amber",
        "bio": "Turkish-Cypriot",
        "image": "null"
      },
      "Class": {
        "Adorable": {
          "name": "",
          "link": ""
        },
        "IronAge": {
          "name": "",
          "link": ""
        }
      }
    }
  ]
}

my java code

    private void parseResult_GetWebData(String result) {
        try {
            JSONObject response = new JSONObject(result);
            JSONArray jsonArray = response.getJSONArray("Amber");

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.optJSONObject(i);
                JSONObject jsonArray1 = jsonObject.getJSONObject("Info");
                JSONObject jsonArray2 = jsonObject.getJSONObject("Class");

                    String bio = jsonArray1.optString("bio");
                    String link = jsonArray2.optString("link");



            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

С моим кодом ничего не получается, я не знаю, что именно делаю работу

Ответы [ 5 ]

4 голосов
/ 20 января 2020

Вы должны использовать модель данных, то есть стандартным способом.

Основной класс Pojo

public class MyModel
{
    private Amber[] Amber;

    public Amber[] getAmber ()
    {
        return Amber;
    }

    public void setAmber (Amber[] Amber)
    {
        this.Amber = Amber;
    }

    @Override
    public String toString()
    {
        return "[Amber = "+Amber+"]";
    }
}

Янтарь. java

public class Amber
{
    private Class Class;

    private Info Info;

    //Can not getClass name of this method becuase getClass method is define in Object class so make it just getClassi or anything else.
    public Class getClassi ()
    {
        return Class;
    }

    public void setClass (Class Class)
    {
        this.Class = Class;
    }

    public Info getInfo ()
    {
        return Info;
    }

    public void setInfo (Info Info)
    {
        this.Info = Info;
    }

    @Override
    public String toString()
    {
        return "Amber [Class = "+Class+", Info = "+Info+"]";
    }
}

Класс. java

public class Class
{
    private Adorable Adorable;

    private IronAge IronAge;

    public Adorable getAdorable ()
    {
        return Adorable;
    }

    public void setAdorable (Adorable Adorable)
    {
        this.Adorable = Adorable;
    }

    public IronAge getIronAge ()
    {
        return IronAge;
    }

    public void setIronAge (IronAge IronAge)
    {
        this.IronAge = IronAge;
    }

    @Override
    public String toString()
    {
        return "Info [Adorable = "+Adorable+", IronAge = "+IronAge+"]";
    }
}

IronAge. java

public class IronAge
{
    private String name;

    private String link;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getLink ()
    {
        return link;
    }

    public void setLink (String link)
    {
        this.link = link;
    }

    @Override
    public String toString()
    {
        return "IronAge [name = "+name+", link = "+link+"]";
    }
}

Восхитительно. java


public class Adorable
{
    private String name;

    private String link;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getLink ()
    {
        return link;
    }

    public void setLink (String link)
    {
        this.link = link;
    }

    @Override
    public String toString()
    {
        return "Adorable [name = "+name+", link = "+link+"]";
    }
}

Информация. java

public class Info
{
    private String image;

    private String name;

    private String bio;

    public String getImage ()
    {
        return image;
    }

    public void setImage (String image)
    {
        this.image = image;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getBio ()
    {
        return bio;
    }

    public void setBio (String bio)
    {
        this.bio = bio;
    }

    @Override
    public String toString()
    {
        return " class [image = "+image+", name = "+name+", bio = "+bio+"]";
    }
}

Теперь используйте GSON для анализа JSON данных в классе модели.

Это зависимость Gradle для GSON

dependencies {
  implementation 'com.google.code.gson:gson:2.8.6'
}
public void parse(String jsonString){
        Gson gson = new Gson();
        MyModel model = gson.fromJson(jsonString, MyModel.class);
        for(Amber amber : model.getAmber()){
            //TO GET Links
            String link1 = amber.getClassi().getAdorable().getLink();
            String link2 = amber.getClassi().getIronAge().getLink(); 
        }
    }


Вы можете использовать this для преобразования JSON в модели классов pojo.

0 голосов
/ 20 января 2020

Простой и короткий ответ, пожалуйста, попробуйте этот

 try {
        JSONObject objects=new JSONObject(object);
        JSONArray array=objects.getJSONArray("Amber");
        for(int j=0; j<array.length(); j++)
        {
            String bio=array.optJSONObject(j).optJSONObject("Info").optString("bio");
            String linkClass=array.optJSONObject(j).optJSONObject("Class").optJSONObject("Adorable").optString("link");
            String linkIronAge=array.optJSONObject(j).optJSONObject("Class").optJSONObject("IronAge").optString("link");
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
0 голосов
/ 20 января 2020

Поскольку некоторые имена полей в вашей строке JSON не являются фиксированными, лучшим способом является преобразование их в Map<String, Object> и иерархическое получение значения в следующем фрагменте кода.

Кстати, там два идентичных имени поля - link - в JSON строке, поэтому я изменяю его значение для идентификации следующим образом:

Изменено JSON строка

...
"Adorable": {
  "name": "",
  "link": "Adorable-link"
},
"IronAge": {
  "name": "",
  "link": "IronAge-link"
}
...

Фрагмент кода

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> data = mapper.readValue(jsonStr, new TypeReference<HashMap<String, Object>>(){});

data.forEach((k,v) -> {
    ((List<Object>) v).forEach(e -> {
        Map<String, Object> infoNode = (Map<String, Object>) ((Map<String, Object>) e).get("Info");
        System.out.println("The value of bio: " + infoNode.get("bio").toString());

        Map<String, Object> classNode = (Map<String, Object>) ((Map<String, Object>) e).get("Class");
        classNode.forEach((k1,v1) -> {
            System.out.println("The value of link in " + k1 + ": " + ((Map<String, Object>) v1).get("link").toString());
        });
    });
});

Консольный вывод

Значение био: Turki sh -Cypriot
Значение ссылки в Adorable: Adorable-link
Значение ссылки в IronAge: IronAge-link

0 голосов
/ 20 января 2020

Пожалуйста, проверьте обновленный ответ вышеуказанного кода. В моей системе я успешно выполнил код без cra sh и вывода значения.

enter image description here.

        try {
            String json= "{\n" +
                    "  \"Amber\": [\n" +
                    "    {\n" +
                    "      \"Info\": {\n" +
                    "        \"name\": \"Amber\",\n" +
                    "        \"bio\": \"Turkish-Cypriot\",\n" +
                    "        \"image\": \"null\"\n" +
                    "      },\n" +
                    "      \"Class\": {\n" +
                    "        \"Adorable\": {\n" +
                    "          \"name\": \"\",\n" +
                    "          \"link\": \"\"\n" +
                    "        },\n" +
                    "        \"IronAge\": {\n" +
                    "          \"name\": \"\",\n" +
                    "          \"link\": \"\"\n" +
                    "        }\n" +
                    "      }\n" +
                    "    }\n" +
                    "  ]\n" +
                    "}";
            JSONObject jsonObject = new JSONObject(json);
            JSONArray jsonArrayAmber= jsonObject.getJSONArray("Amber");
            for(int i=0; i<jsonArrayAmber.length(); i++) {
                JSONObject jsonObject1= jsonArrayAmber.getJSONObject(i).getJSONObject("Info");
                if(jsonObject1!=null) {
                    String bioValue= jsonObject1.getString("bio");
                    System.out.println("jsonTest "+bioValue);
                }
                JSONObject jsonObject2= jsonArrayAmber.getJSONObject(i).getJSONObject("Class");
                if(jsonObject2!=null) {
                    JSONObject jsonObjectAdorable = jsonObject2.getJSONObject("Adorable");
                    if(jsonObjectAdorable!=null) {
                        String linkAdorable = jsonObjectAdorable.getString("link");
                        System.out.println("jsonTest "+linkAdorable);
                    }
                    JSONObject jsonObjectIronAge = jsonObject2.getJSONObject("IronAge");
                    if(jsonObjectIronAge!=null) {
                        String IronAgeLink = jsonObjectIronAge.getString("link");
                        System.out.println("jsonTest "+ IronAgeLink);
                    }
                }
            }
    } catch (Exception e){
        e.printStackTrace();
    }
0 голосов
/ 20 января 2020

Class - это JSOnObject с несколькими JSONObject's внутри, поэтому один раз после получения Class вам нужно перебирать каждый JSONObject, чтобы получить link значение

JSONObject jsonObject2 = jsonObject.getJSONObject("Class");
Iterator<String> itr = jsonObject2.keys();

while(itr.hasNext())  {

     JSONObject innerObj = jsonObject2.getJSONObject(itr.next());
     String link = innerObj.optString("link");
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...