Java 为什么我要多次获取数据?

Java 为什么我要多次获取数据?,java,json,Java,Json,我正在使用JavaPOJO类创建json。在这种情况下,只有当我循环遍历某个值时,它才会在json中多次打印该值 这是我的java类:- public class App { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); MyPojo myPojo = createDummy(); String jsonString;

我正在使用JavaPOJO类创建json。在这种情况下,只有当我循环遍历某个值时,它才会在json中多次打印该值

这是我的java类:-

public class App {

    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        MyPojo myPojo = createDummy();

        String jsonString;
        try 
        {
            jsonString = mapper.writeValueAsString(myPojo);
            System.out.println(jsonString);
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }

    private static MyPojo createDummy() 
    {
        MyPojo myPojo = new MyPojo();
        myPojo.setName("State");

        Children child;
        ArrayList<Children> aChild = new ArrayList<>();

        Children1 child1;
        ArrayList<Children1> aChild1 = new ArrayList<>();

        Children2 child2 = null;
        ArrayList<Children2> aChild2 = new ArrayList<>();
        for(int i=0; i<3; i++)
        {
            child = new Children();
            child.setName("Bihar");

            for(int j=0; j<6; j++)
            {
                child1 = new Children1();
                child1.setName("Patna");

                for(int k=0; k<2; k++)
                {
                    child2 = new Children2();
                    child2.setName("CSE");
                    child2.setSize(4);

                    aChild2.add(child2);
                }
                child1.setChildren2(aChild2);
                aChild2.remove(child2);
                aChild1.add(child1);
            }
            child.setChildren1(aChild1);
            aChild.add(child);
        }
        myPojo.setChildren(aChild);

        return myPojo;
    }
  }
public class MyPojo 
{
    private String name;
    private ArrayList<Children> children;

    public String getName() 
    {
        return name;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
    public ArrayList<Children> getChildren() 
    {
        return children;
    }
    public void setChildren(ArrayList<Children> children) 
    {
        this.children = children;
    }   
}
我希望我的json输出如下:- 如何得到这个

{
    "name": "State", "children": 
    [{
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    },
     {
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    }, 
    {
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    }]
};

您正在重用列表
aChild1
aChild2

您必须理解,在Java中将对象分配给引用不会创建副本。它只是使该引用引用该对象(因此称为名称引用)

您需要将这些列表移动到循环中,以便为每个孩子创建一个新列表。通常,您应该始终声明变量并在需要它们的地方创建对象,而不是更早。这将使您的代码更具可读性,并防止您现在遇到的错误:

ArrayList<Children> aChild = new ArrayList<>();
for(int i=0; i<3; i++)
{
    Children child = new Children();
    child.setName("Bihar");

    ArrayList<Children1> aChild1 = new ArrayList<>();
    for(int j=0; j<6; j++)
    {
        Children1 child1 = new Children1();
        child1.setName("Patna");

        ArrayList<Children2> aChild2 = new ArrayList<>();
        for(int k=0; k<2; k++)
        {
            Children2 child2 = new Children2();
            child2.setName("CSE");
            child2.setSize(4);

            aChild2.add(child2);
        }
        child1.setChildren2(aChild2);
        aChild1.add(child1);
    }
    child.setChildren1(aChild1);
    aChild.add(child);
}
myPojo.setChildren(aChild);

@幽灵猫现在我把所有的东西都贴出来了。请帮帮我,到底是什么问题?您正在创建一个包含3个比哈尔邦、每个比哈尔邦6个帕特纳和每个帕特纳2个CSE的列表。我可以看到的一个问题是,您正在为每个元素重用完全相同的列表,因此它们之间有共享的列表。要解决这个问题,您需要在适当的循环中重新初始化列表。更好,但仍然缺少:实际输出是什么。意思:不要让它来计算你的代码创建了什么,以及它如何偏离你的预期?@Rockers Upvote支持快速学习如何提问,现在对于问题,你需要根据预期的输出验证你的循环。我想你在期待这个{“名字”:“州”,“孩子们”:[{“名字”:“比哈尔”,“孩子们”:[{“名字”:“帕特纳”,“孩子们”:[{“名字”:“CSE”,“大小”:0},]}}请遵循说明,您必须提供您期望的内容,这有助于我们具体回答非常好的答案,并提供许多有用的提示!
public class Children2 {
    private String name;
    private int size;

    public String getName() 
    {
        return name;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
    public int getSize() 
    {
        return size;
    }
    public void setSize(int size) 
    {
        this.size = size;
    }
}
{
    "name": "State", "children": 
    [{
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    },
     {
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    }, 
    {
        "name": "Bihar",
        "children": 
        [
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }, 
        {"name": "Patna",
         "children":
             [
              {"name": "CSE", "size": 0},
              {"name": "CSE", "size": 0}
             ]
        }
        ]
    }]
};
ArrayList<Children> aChild = new ArrayList<>();
for(int i=0; i<3; i++)
{
    Children child = new Children();
    child.setName("Bihar");

    ArrayList<Children1> aChild1 = new ArrayList<>();
    for(int j=0; j<6; j++)
    {
        Children1 child1 = new Children1();
        child1.setName("Patna");

        ArrayList<Children2> aChild2 = new ArrayList<>();
        for(int k=0; k<2; k++)
        {
            Children2 child2 = new Children2();
            child2.setName("CSE");
            child2.setSize(4);

            aChild2.add(child2);
        }
        child1.setChildren2(aChild2);
        aChild1.add(child1);
    }
    child.setChildren1(aChild1);
    aChild.add(child);
}
myPojo.setChildren(aChild);
ArrayList<Child> children = new ArrayList<>();
for(int i=0; i<3; i++)
{
    Child child = new Child();
    child.setName("Bihar");
    children.add(child);

    ArrayList<Child> innerchildren = new ArrayList<>();
    for(int j=0; j<6; j++)
    {
        Child innerchild = new Child();
        innerchild.setName("Patna");
        innerchildren.add(innerchild);

        ArrayList<Child> innermostchildren = new ArrayList<>();
        for(int k=0; k<2; k++)
        {
            SizableChild innermostchild = new SizableChild();   // SizableChild extends Child and adds the methods setSize and getSize
            innermostchild.setName("CSE");
            innermostchild.setSize(4);

            innermostchildren.add(innermostchild);
        }
        innerchild.setChildren(innermostchildren);
    }
    child.setChildren(innerchildren);
}
myPojo.setChildren(children);