如何用多个值填充对象的数组属性
How to fill out array properties of the object with multiple values
我确实使用 strust-json
库自动将 java object
转换为 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();
然后我尝试使用 for-each
循环填写它:
for (OrganisationUnitNameHistory children : children2){
results.setId(new Integer[] {children.getOrganisationunitCode()});
results.setText(new String[] {children.getName()});
}
问题是,我只从客户端的输出中获取数组的最后一个值。
{"results":{"id":[3509],"text":["text 1"]}}
但是,对象 children
例如具有所有 5 个值。好像我每次都覆盖相同的数组值,而不是填写新的数组值。我很困惑我犯的逻辑错误在哪里。一定很简单..
您应该将 id 和文本包装到新的 class 中,并将它们的集合存储在结果中:
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;
}
}
使用循环填充它:
Results results = new Results();
for (OrganisationUnitNameHistory children : children2) {
OrganisationUnit ou = new OrganisationUnit();
ou.setId(children.getOrganisationunitCode());
ou.setText(children.getName());
results.getResults().add(ou);
}
或者直接不使用Result class:
List<OrganisationUnit> results = new ArrayList<>();
for (OrganisationUnitNameHistory children : children2) {
OrganisationUnit ou = new OrganisationUnit();
ou.setId(children.getOrganisationunitCode());
ou.setText(children.getName());
results.add(ou);
}
您正在获取最后一个值,因为这是您要求代码执行的操作。
我不确定 children2 是哪种变体,但可以说它是 List<ResultsOrganisationUnit>
那么一个解决方案是:
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);
但是您所指的任务仍然没有通过您的代码完成。
根据您提供的值,您将看到类似于以下内容的内容:
{
"results":
{
"id":[1, 2, 3],
"text":["text 1", "text 2", "text 3"]
}
}
为了能够在评论中获得您所要求的内容,请像这样创建您的 OrganisationUnit
:
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;}
}
然后将结果的值存储在 List<OrganisationUnit>
List<OrganisationUnit> results = new ArrayList();
for (OrganisationUnitNameHistory child : children2) {
OrganisationUnit tempChild = new OrganisationUnit();
tempChild.setId(child.getOrganisationunitCode());
tempChild.setText(child.getName());
results.add(tempChild);
}
您 return 的结果应该与您在评论栏中查找的内容一致。
你的结构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;
}
...
所以你会坚持更多的价值观,但据我了解,这并不是你所需要的,因为结果的结构将继续与你抱怨的相同:
// ids和texts没有关联
{
"results":
{
"id": [3509, 8987, 1234, 777, 987],
"text": ["text 1", "text 2", "text 3"]
}
}
请注意,results 是一个复杂对象的数组,而不是 String 和 Integer 等值对象。也许理想的情况是您创建一个新对象来表现并关联 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;
}
}
你的 for-each 看起来像这样:
ResultsOrganisationUnit results = new ResultsOrganisationUnit();
for(OrganizationUnitNameHistory children: children2) {
ResultsOrganisationChild child = new ResultsOrganisationChild (children.getOrganisationunitCode(), children.getName());
results.addChild(child);
}
我确实使用 strust-json
库自动将 java object
转换为 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();
然后我尝试使用 for-each
循环填写它:
for (OrganisationUnitNameHistory children : children2){
results.setId(new Integer[] {children.getOrganisationunitCode()});
results.setText(new String[] {children.getName()});
}
问题是,我只从客户端的输出中获取数组的最后一个值。
{"results":{"id":[3509],"text":["text 1"]}}
但是,对象 children
例如具有所有 5 个值。好像我每次都覆盖相同的数组值,而不是填写新的数组值。我很困惑我犯的逻辑错误在哪里。一定很简单..
您应该将 id 和文本包装到新的 class 中,并将它们的集合存储在结果中:
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;
}
}
使用循环填充它:
Results results = new Results();
for (OrganisationUnitNameHistory children : children2) {
OrganisationUnit ou = new OrganisationUnit();
ou.setId(children.getOrganisationunitCode());
ou.setText(children.getName());
results.getResults().add(ou);
}
或者直接不使用Result class:
List<OrganisationUnit> results = new ArrayList<>();
for (OrganisationUnitNameHistory children : children2) {
OrganisationUnit ou = new OrganisationUnit();
ou.setId(children.getOrganisationunitCode());
ou.setText(children.getName());
results.add(ou);
}
您正在获取最后一个值,因为这是您要求代码执行的操作。
我不确定 children2 是哪种变体,但可以说它是 List<ResultsOrganisationUnit>
那么一个解决方案是:
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);
但是您所指的任务仍然没有通过您的代码完成。 根据您提供的值,您将看到类似于以下内容的内容:
{
"results":
{
"id":[1, 2, 3],
"text":["text 1", "text 2", "text 3"]
}
}
为了能够在评论中获得您所要求的内容,请像这样创建您的 OrganisationUnit
:
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;}
}
然后将结果的值存储在 List<OrganisationUnit>
List<OrganisationUnit> results = new ArrayList();
for (OrganisationUnitNameHistory child : children2) {
OrganisationUnit tempChild = new OrganisationUnit();
tempChild.setId(child.getOrganisationunitCode());
tempChild.setText(child.getName());
results.add(tempChild);
}
您 return 的结果应该与您在评论栏中查找的内容一致。
你的结构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;
}
...
所以你会坚持更多的价值观,但据我了解,这并不是你所需要的,因为结果的结构将继续与你抱怨的相同:
// ids和texts没有关联
{
"results":
{
"id": [3509, 8987, 1234, 777, 987],
"text": ["text 1", "text 2", "text 3"]
}
}
请注意,results 是一个复杂对象的数组,而不是 String 和 Integer 等值对象。也许理想的情况是您创建一个新对象来表现并关联 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;
}
}
你的 for-each 看起来像这样:
ResultsOrganisationUnit results = new ResultsOrganisationUnit();
for(OrganizationUnitNameHistory children: children2) {
ResultsOrganisationChild child = new ResultsOrganisationChild (children.getOrganisationunitCode(), children.getName());
results.addChild(child);
}