GWT/GXT, JSON, аннотация @Path с массивами

Я создаю сетку с переменным числом столбцов. Я почти закончен, но осталось только одно ... Я не могу использовать атрибут доступа Address (интерфейс PersonProperties). Я не знаю, как правильно писать @Path. Если у кого есть какие-либо идеи, пожалуйста, дайте мне совет.

У меня этот JSON: [{         «FirstName»: «Джон»,         «LastName»: «Doe»,         «Возраст»: 23,         "Детали": [             {                 «Адрес»: «Apt R113»,                 «Город»: «Бостон»,                 «ZipCode»: «30523»             },             {                 «Адрес»: «ABC 22»,                 «Город»: «Париж»,                 «ZipCode»: «51112»             }         ]     } ]

а затем интерфейс PropertyAccess:

public interface PersonProperties extends PropertyAccess {

ModelKeyProvider key();

ValueProvider FirstName();

ValueProvider LastName();

ValueProvider Age();

@Path("Details???Address")
ValueProvider Address();

}

0
nl ja de
Используете ли вы AutoBeans для сортировки JSON в графе объектов? Основываясь на том, что вы разместили, похоже, что вам не хватает этого шага.
добавлено автор Bionic_Geek, источник

1 ответы

Предполагая, что ваш объект PersonDTO является представлением объекта JSON, я бы предположил, что у вас есть модель интерфейса (для использования AutoBeans), которая выглядит примерно так:

// I'm leaving the setters out for brevity
public interface PersonDTO {
  @PropertyName(value="FirstName")
  String getFirstName();
  @PropertyName(value="LastName")
  String getLastName();
  @PropertyName(value="Age")
  Integer getAge();
  @PropertyName(value="Details")
  List
getDetails(); } public interface Details { @PropertyName(value="Address") String getAddress(); @PropertyName(value="City") String getCity(); @PropertyName(value="ZipCode") String getZipCode(); }

Предполагая, что это сопоставляет модель интерфейса, которую вы используете (или близко приближаете ее), затем, чтобы ответить на ваш вопрос, аннотация @Path используется для указания имен атрибутов объекта для доступа к свойству (а не JSON имена). Таким образом, для отдельных атрибутов аннотация пути может использоваться, если ваше значение PropertyAccess не совпадает с именем атрибута. В вашем примере атрибуты PersonProperties капитализируются, поэтому вы можете использовать что-то вроде этого:

@Path("firstName")
ValueProvider FirstName();

Если ваш объект Details был всего лишь одним объектом, вы могли бы использовать нотацию, аналогичную тому, что вы написали (помните, что аннотация @Path - это нечеткость, определяющая геттеры, используемые для доступа к свойству из прокладки объекта):

@Path("details.address")
ValueProvider address(); 
// would return the address if Details was a single object

Однако значения Details немного отличаются, поскольку пример JSON показывает, что значения Details на самом деле представляют собой набор Details . В результате ваша сетка не будет знать, как отображать Детали, поскольку для каждого объекта PersonDTO существует несколько объектов Details. Но я предполагаю, что это было уже ясно для вас, поэтому давайте предположим, что вы пытаетесь отобразить адрес в заданной строке, когда применяются определенные условия. В таком случае вы можете реализовать свой собственный ValueProvider. Например (например, из-за примера Sencha):

public class AddressByCityValueProvider implements ValueProvider {
  public final String cityKey;

  public AddressByCityValueProvider(String specifiedKey) {
    this.cityKey = specifiedKey;
  }

 //we will display their Address if the city is Boston
  @Override
  public String getValue(PersonDTO person) {
    if (null != person.getDetails()) {
      for (Details detail : person.getDetails()) {
        if (detail.getCity().equalsIgnoreCase(cityKey)) {
          return detail.getAddress();
        }
      }
    }
    return "";//no address for specified city in object, return a blank String
  }

  @Override
  public String getPath() {
    return key;
  }

Затем, когда вы использовали ValueProvider из класса PropertyAccess, вы замените свой собственный ValueProvider и укажите используемый ключ. Для конфигурации столбцов вы можете использовать этот ValueProvider для возврата адреса улицы, когда город находится в Бостоне:

ColumnConfig addressColumn = 
   new ColumConfig(new AddressByCityValueProvider("Boston"), 100, "Address");

Очевидно, это всего лишь один пример, но, надеюсь, вы получите эту идею.

2
добавлено
Думаю, у меня есть идея. Я ценю ваш совет, спасибо!
добавлено автор ladinho10, источник