java - 无法使用 JSON 在数组下添加数组元素

标签 java json

我必须生成以下示例格式的 JSON:

    [
    {   "roleName" : "Parent Folder", "folderId" : "role1", "expanded" : true, 
        "children" : 
                    [                                                                                                     
                      { "roleName" : "subUser1 non-openable folder", "folderId" : "role11","fileicon" : true },
                      { "roleName" : "subUser2", "folderId" : "role12", "expanded" : true, 
            "children" : 
                       [        
                          { "roleName" : "subUser2-1", "folderId" : "role121", "expanded" : true, "children" : 
                           [
                            { "roleName" : "subUser2-1-1 folder ico", "folderId" : "role1211" },
                            { "roleName" : "subUser2-1-2 file ico", "folderId" : "role1212" , "fileicon" : true}
                           ]
                          }
                      ]
                      }
                    ]
    }
 ]

我已经为其创建了 POJO,并且能够添加数组元素,但无法在该元素内部或下方添加一个数组。请提出建议。

下面是我正在使用的pojo。

public class TargetFolder
{
    private TargetChildren[] children;

    private String roleName;

    private String expanded;

    private Long folderId;

    public TargetFolder(String roleName,
            String isFolder, Long folderId, TargetChildren[] folderList) {
        super();
        this.roleName = roleName;
        this.expanded = isFolder;
        this.folderId = folderId;
        this.children = folderList;
    }



    public TargetChildren[] getChildren ()
    {
        return children;
    }

    public void setChildren (TargetChildren[] children)
    {
        this.children = children;
    }

    public String getRoleName ()
    {
        return roleName;
    }

    public void setRoleName (String roleName)
    {
        this.roleName = roleName;
    }

    public String getExpanded ()
    {
        return expanded;
    }

    public void setExpanded (String expanded)
    {
        this.expanded = expanded;
    }

    public Long getFolderId ()
    {
        return folderId;
    }

    public void setFolderId (Long folderId)
    {
        this.folderId = folderId;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [children = "+children+", roleName = "+roleName+", expanded = "+expanded+", folderId = "+folderId+"]";
    }
}

and

public class TargetChildren
{


    private String fileicon;

    private String roleName;

    private long folderId;


    public TargetChildren(String roleName, String fileicon, long folderId) {
        super();
        this.fileicon = fileicon;
        this.roleName = roleName;
        this.folderId = folderId;
    }


    public String getFileicon ()
    {
        return fileicon;
    }

    public void setFileicon (String fileicon)
    {
        this.fileicon = fileicon;
    }

    public String getRoleName ()
    {
        return roleName;
    }

    public void setRoleName (String roleName)
    {
        this.roleName = roleName;
    }

    public long getFolderId ()
    {
        return folderId;
    }

    public void setFolderId (long folderId)
    {
        this.folderId = folderId;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [fileicon = "+fileicon+", roleName = "+roleName+", folderId = "+folderId+"]";
    }
}

下面是我用来生成 JSON 的逻辑:

for(int i  = 0; i<folderList.size();i++)
        {
            if(folderList!=null)
            {
                subList  = (List)folderList.get(i);
                childFolders[i] = new TargetChildren((String)subList.get(0),(String)subList.get(2),(Long)subList.get(1));
                JSONArray arr =  new JSONArray();
                if(((String)subList.get(2)).equals("true"))
                {
                    arr.put(i, childFolders[i]);
                }
                System.out.println(arr.toString());
                //TargetChildren [] testArr = new TargetChildren[] { new TargetChildren("Folder", "folderName", 226886843L)};
            }
        }
        TargetFolder targetFolder = new TargetFolder(parentFoldername,isFolder,folderId, childFolders);
        JSONObject jsonObject = new JSONObject(targetFolder);
        String jsonString = jsonObject.toString();
        System.out.println("JSON TO UI------ "+jsonString);

最佳答案

我能想到的最优雅、最简单的解决方案是向 POJO 添加一个 toJSON 方法,并让它自行处理序列化。

对于TargetFolder:

public JSONObject toJSON(){
    JSONObject out = new JSONObject();
    out.put("rolename", rolename);
    out.put("expanded", expanded);
    out.put("folderID", folderId);

    JSONArray children = new JSONArray();
    for(int i = 0; i < this.children.length; i++){
        children.push(this.children[i].toJSON());
    }
    out.put("children", children);

    return out;
}

TargetChildren 执行相同的操作,然后您可以通过调用将其转换为 JSON:

myTargetFolder.toJSON();

这样您就无需担心生成的 JSON 的递归结构。

如果您添加一个采用 JSONObject 的构造函数,则可以确保在一处进行一致的序列化和反序列化。

还有 Google 的 GSON 库,它应该实现基本相同的功能,但我从未使用过它,所以我不能说它是如何工作的。

<小时/>

P.S.:您可能希望为 TargetFolderTargetChild 创建一个公共(public)父类(super class),并将其用作 children 数组的数据类型,因为从 JSON 来看,该数组似乎可以包含带有 TargetFolder-properties 的对象(“expanded”和“children”)和带有 TargetChild-properties(“fileicon”)的对象

关于java - 无法使用 JSON 在数组下添加数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31518718/

相关文章:

java - 如何使用正则表达式给出查找头的范围,例如 ^(?=(.*[a-z]){1,3})(?=.*[0-9]).{2,5}$

Java 获取设置一类轮

c# - 格式化 ESRI 地理编码器的 RestSharp 请求

c# - 为 json 数据编写 .net 对象

android - 将 JSON 字符串解析为 SQLite 表的最快方法是什么?

java - 最终变量的可访问性

Java - 从配置文件加密/解密用户名和密码

java - java 不支持的类版本错误

JSON.simple API Javadoc

javascript - AJAX post请求,包含数组和其他对象的对象,无法正确解析到rails中