如何获取数组中json子项的值

Posted

技术标签:

【中文标题】如何获取数组中json子项的值【英文标题】:How to get the value of json child in an array 【发布时间】:2020-05-06 01:59:39 【问题描述】:

bio 的值和这个 JSON 文件中的值如何链接到我正在使用 android studio 的字符串


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

我的java代码

    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();
        
    

我的代码没有得到任何结果,我不知道到底在做什么

【问题讨论】:

如果您不想直接使用 JSON 解析器,可以使用 JsonPath 轻松完成。 @VivekMishra 请阅读代码并理解他只是用作变量名 【参考方案1】:

简单而简短的回答,请试试这个

 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();
    

【讨论】:

不工作的应用程序崩溃了我尝试使用此代码作为列表并且它工作但我不知道为什么它不适用于单个字符串值,我不知道到底是什么错误 把你的 json 文件给我,我认为 key 是空的,你拿的是哪个 它适用于您提到的 json【参考方案2】:

由于 JSON 字符串中的某些字段名称不固定,因此更好的方法是将其转换为 Map&lt;String, Object&gt; 并按以下代码 sn-p 分层检索值。

顺便说一句,JSON 字符串中有 两个 相同的字段名称 - link,因此我将其值修改如下:

修改后的 JSON 字符串

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

...

代码 sn-p

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());
        );
    );
);

控制台输出

生物的价值:土族塞人 Adorable中link的值:Adorable-link IronAge中link的值:IronAge-link

【讨论】:

【参考方案3】:

请检查上述代码的更新响应。在我的系统中,我成功执行了代码,没有崩溃和值输出。

.

        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();
    

【讨论】:

你能解释一下你做了哪些小改动,因为我只看到你添加了条件 @Serenity,我更新了我的答案。请检查日志文件中的响应。【参考方案4】:

您应该使用数据模型,即标准方式。

主 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+"]";
    


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+"]";
    

Info.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 数据解析为模型类。

这是 GSON 的 Gradle 依赖项

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 类。

【讨论】:

我正在以编程方式获取信息和 Amber,因此我无法修复为它创建类的问题,我需要它以编程方式工作 您的意思是 info 和 Amber 或其他键不固定?如果您的密钥是固定的并且您正在以编程方式获取数据,那么这就是这样做的方法 我正在使用字符串意图来获取“Amber”和“Info”的值,因此我无法为其创建常量类,因为这些值在整个应用程序中都不是常量 查看最后一个函数parse(String jsonString) 这里你的JSON字符串不需要固定,值也不需要固定或恒定。另请参阅GSON 的工作原理。【参考方案5】:

ClassJSOnObject 内部有多个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");
   

【讨论】:

但是我如何获得信息中生物的价值 你可以直接从jsonArray1.optString("bio")@Serenity 获取它并迭代Class JSONObject 只得到link jsonArray2.getJSONObject("Adorable").getString("link")...你这样问..

以上是关于如何获取数组中json子项的值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取json数组的子节点的值

如何在 Laravel Eloquent 中获取包含数组的 JSON 对象的值?

如何仅获取 index[0] 的值以显示 JSON 对象中的数组?

js 中如何取出数组中的值?

js如何获取json值

js如何获取表单中数组的值?