Java 如何用多个值填充对象的数组属性

Java 如何用多个值填充对象的数组属性,java,arrays,json,struts,Java,Arrays,Json,Struts,我确实使用strustjson库将java对象自动转换为json。任务是从服务器向客户端提供以下输出: { "results": { "id": 1, "text": "Option 1" }, { "id": 2, "text": "Option 2" } } 我已创建具有数组属性的对象: public class ResultsOrganisationUnit { private Integer[] id = new Integer[100]; private Str

我确实使用strustjson库将java对象自动转换为json。任务是从服务器向客户端提供以下输出:

{
"results": 
{
  "id": 1,
  "text": "Option 1"
},
{
  "id": 2,
  "text": "Option 2"
}
} 
我已创建具有数组属性的对象:

public class ResultsOrganisationUnit {

private Integer[] id = new Integer[100];
private String[] text = new String[100];
public Integer[] getId() {
    return id;
}
public void setId(Integer[] id) {
    this.id = id;
}
public String[] getText() {
    return text;
}
public void setText(String[] text) {
    this.text = text;
}           

}
初始化它:

results = new ResultsOrganisationUnit();
然后,我尝试在每个周期中使用:

问题是,我只得到客户端输出中数组的最后一个值

{"results":{"id":[3509],"text":["text 1"]}}

但是,例如,对象子对象具有全部5个值。似乎每次都覆盖相同的数组值,而不是填充新的数组值。我不知道我犯的逻辑错误在哪里。它必须很简单。

您应该将id和文本包装到新类中,并将它们的集合存储在结果中:

public class OrganisationUnit {
    private Integer id;
    private String text;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

public class Results {

    private List<OrganisationUnit> results = new ArrayList<>();

    public List<OrganisationUnit> getResults() {
        return results;
    }

    public void setResults(List<OrganisationUnit> results) {
        this.results = results;
    }
}
或者不使用结果类直接执行:

List<OrganisationUnit> results = new ArrayList<>();

for (OrganisationUnitNameHistory children : children2) {
        OrganisationUnit ou = new OrganisationUnit();
        ou.setId(children.getOrganisationunitCode());
        ou.setText(children.getName());
        results.add(ou);
}

您将获得最后一个值,因为这是您要求代码执行的操作。 我不确定孩子2是什么样的变量,但假设它是一个列表,那么一个解决方案是:

private Integer[] ids = new Integer[100];
private String[] texts = new String[100];

for ( int i=0; i < children2.size(); i++) {
    ids[i] = children2[i].getOrganisationunitCode();
    texts[i] = children2[i].getName();
}

results.setId(ids);
results.setText(texts);
要想获得您在评论中的要求,请创建如下组织单元:

public class OrganisationUnit{
   private Integer id;
   private String text;
   public Integer getId(){return id;}
   public void setId(Integer id){this.id = id;}
   public String getText(){return text;}
   public void setText(String text){this.text = text;}
}
ResultsOrganisationUnit results = new ResultsOrganisationUnit();
for(OrganizationUnitNameHistory children: children2) {
    
    ResultsOrganisationChild child = new ResultsOrganisationChild (children.getOrganisationunitCode(), children.getName());
    results.addChild(child);
}
然后将结果的值存储在列表中


返回的结果应符合您在“注释”字段中查找的内容

json的结构不遵循该模式,因为您留下的结果应该是一个数组

你看

可以采取以下结构:

{ 结果:     [ {id:1,text:Option 1}, {id:2,text:Option 2} ] }

您需要在数组中输入一个值,但始终要更新对新数组的引用:

...
private Integer[] id = new Integer [100];
...
public void setId(Integer[] id){
    // here you are adding the reference to a new array, overwriting your id reference to which you started with a new Integer[100]
    this.id = id;
}
为了让数组存储ID,您可能需要一个新属性来存储当前位置。您的setId应该获得一个整数的引用,而不是整数数组,并将值添加到此数组中

private Integer[] id = new Integer[100];
private int nextPosition = 0;
...
// I omit the treatment here so that it does not add a position beyond what its array allows for simplification purposes.
public void setId(Integer[] id) {
    this.id[nextPosition] = id;
    nextPosition = nextPosition + 1;
}
...
因此,你会坚持更多的价值观,但从我的理解来看,这并不完全是你所需要的,因为结果的结构将继续与你所抱怨的相同:

//ID和文本之间没有关联

{
  "results": 
     {
       "id": [3509, 8987, 1234, 777, 987], 
       "text": ["text 1", "text 2", "text 3"]
     }
}
请注意,结果是复杂对象的数组,而不是字符串和整数等值对象。也许理想的做法是创建一个新的对象来表现并关联id和文本属性

public class ResultsOrganisationChild {
   private Integer id;
   private String text;

   public ResultsOrganisationChild(Integer id, String text){
        this.id = id;
        this.text = text;
   }
   // add some gets and sets
}
或者,您可以使用列表而不是数组,因为这样您就不必担心对象的增长超出您最初可能预见的范围,也不必担心下一个位置:

public class ResultsOrganisationUnit {

    private List<ResultsOrganisationChild> list = new ArrayList<>();
    
    public void addChild(ResultsOrganisationChild child) {
        list.add(child);
    }

    public List<ResultsOrganisationChild> getChild() {
        return this.list;
    }
}

谢谢你的评论,但我不希望结果像你说的那样。我希望它们都在results对象中分开。。客户端库无法处理此类json结果您要求的结果或多或少是不可能得到的。你能得到的最好的东西是一个对象数组,比如:{results:[{id:1,text:Option 1},{id:2,text:Option 2}]}这就是我想要的结果,作为json。一个results对象,它有一个值数组,它将我的答案与我认为您正在寻找的结果相匹配。你要做的是返回结果列表,然后你就可以得到你想要的。genius,谢谢它的工作。然而,有一个小问题,我的结果在输出中重复了两次。{results:{results:[{id:3590,text:text1},{id:3507,text:text2}.你知道怎么去掉吗?据我所知,它来自类结果,但我返回的是在外部声明为object,在execute Method中的一个。我不知道你以后用这个变量做什么,但看起来你根本不需要类结果。请尝试:List Results=new ArrayList;对于OrganizationUnitNameHistory ch儿童:儿童2{OrganizationUnit ou=new OrganizationUnit;ou.setIdchildren.getOrganizationUnitCode;ou.setxtChildren.getName;results.addou;}
{
  "results": 
     {
       "id": [3509, 8987, 1234, 777, 987], 
       "text": ["text 1", "text 2", "text 3"]
     }
}
public class ResultsOrganisationChild {
   private Integer id;
   private String text;

   public ResultsOrganisationChild(Integer id, String text){
        this.id = id;
        this.text = text;
   }
   // add some gets and sets
}
public class ResultsOrganisationUnit {

    private List<ResultsOrganisationChild> list = new ArrayList<>();
    
    public void addChild(ResultsOrganisationChild child) {
        list.add(child);
    }

    public List<ResultsOrganisationChild> getChild() {
        return this.list;
    }
}
ResultsOrganisationUnit results = new ResultsOrganisationUnit();
for(OrganizationUnitNameHistory children: children2) {
    
    ResultsOrganisationChild child = new ResultsOrganisationChild (children.getOrganisationunitCode(), children.getName());
    results.addChild(child);
}