Как заполнить свойства массива объекта несколькими значениями - PullRequest
0 голосов
/ 10 мая 2018

Я использую библиотеку 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 значений. Кажется, что я переопределяю одно и то же значение массива каждый раз вместо того, чтобы заполнять новое. Я запутался, где та логическая ошибка, которую я делаю. Это должно быть что-то простое ..

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Вы получаете последнее значение, потому что это то, что вы просите сделать ваш код. Я не уверен, что это за переменная 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);
}

Результаты, которые вы возвращаете, должны соответствовать тому, что вы ищете в поле для комментариев.

0 голосов
/ 10 мая 2018

Структура вашего json не соответствует шаблону, поскольку результаты, которые вы оставили, должны быть массивом.

Смотрите, что https://www.json.org/.

Что можно было бы сделать, это следующая структура:

{ Результаты: [ {"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;
}

Чтобы массив мог хранить идентификаторы, вам может понадобиться новое свойство для сохранения текущей позиции. И ваш setId должен получить ссылку на Integer вместо целочисленного массива и добавить к этому массиву значение.

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;
}
...

Таким образом, вы бы настаивали на большем количестве ценностей, но, как я понял, это не совсем то, что вам нужно, поскольку структура результата будет оставаться той же, на которую вы жалуетесь:

// Нет связи между идентификаторами и текстами

{
  "results": 
     {
       "id": [3509, 8987, 1234, 777, 987], 
       "text": ["text 1", "text 2", "text 3"]
     }
}

Обратите внимание, что результатом является массив сложного объекта, а не объект-значение, такой как String и Integer. Возможно, в идеале вы должны создать новый объект для поведения и связать свойства id и text.

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
}

При желании вы можете использовать List вместо массива, потому что тогда вам не придется беспокоиться о том, что ваш объект будет расти дальше, чем вы могли изначально предвидеть, кроме того, что вам не придется беспокоиться о следующей позиции:

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);
}
0 голосов
/ 10 мая 2018

Вы должны заключить 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;
    }
}

Заполните его, используя цикл:

    Results results = new Results();

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

Или напрямую, без использования класса результата:

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

for (OrganisationUnitNameHistory children : children2) {
        OrganisationUnit ou = new OrganisationUnit();
        ou.setId(children.getOrganisationunitCode());
        ou.setText(children.getName());
        results.add(ou);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...