Как заполнить пользовательский атрибут в ProdctData JSON? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь получить данные о продукте, основываясь на некоторых критериях запроса. Когда я конвертирую productmodel в productdata, используя конвертеры и популяторы, я получаю в ответ все данные о продукте.

Я пытался установить строковое значение при преобразовании и заполнении данных productmodel в productdata, но это не помогло !!

{
     "products": [
         {
           //Getting from Product Model
           "name" : "ABC"
           "desc" : "abcde"
           "Quantity": 2"

           //Not from Product Model
           "matcode" : "001100"
         },
     ]
 }

возможно ли установить еще одно строковое значение (String matcode ="ABC") внутри того же ответа?

Ответы [ 3 ]

1 голос
/ 16 июня 2019

В идеале, если вы правильно установите matcode (атрибут) в ProductData, это будет отражено в ответе

Измените атрибут matcode внутри ProducctData, объявив его в *beans.xml, что-то вроде.

<bean class="de.hybris.platform.commercefacades.product.data.ProductData">
    <!-- other attributes -->
    <property name="matcode" type="java.util.Set&lt;java.lang.String>"/>
</bean>

Теперь внутри populator, установите значение атрибута matcode, и все готово. Отладьте ваш контроллер и посмотрите, есть ли у вас значение пользовательского атрибута в данных продукта. Если он есть, он будет правильно преобразован в JSON.

@Override
public void populate(final SOURCE productModel, final TARGET productData) throws ConversionException
{
    //... other codes
    productData.setMatcode("001100"); // add your logic to set this value
}
0 голосов
/ 14 июня 2019

Вы можете использовать такую ​​библиотеку, как gson. Предположим, у вас есть такая модель:

public class Products
{
    private List<Product> products;
}


public class Product
{
    private String name;

    private String desc;

    private String Quantity;
}

Простой способ:

Добавить еще один атрибут в модель продукта

  private String matcode;

Теперь можно использовать код ниже:

  Gson gson = new Gson();
  String jsonOutput = "{\"products\": [{ \"name\" : \"ABC\" ,\"desc\" : \"abcde\", \"Quantity\": \"2\"}]}";
  Products products = gson.fromJson(jsonOutput, Products.class);
  System.out.println(products);

  for(Product p : products.getProducts()){
    p.setMatcode("001100");
  }

 System.out.println(gson.toJson(products));

Еще один более длинный путь:

а. прочитайте ответ JSON б. преобразовать в объект (что вы уже должны делать) с. используйте gson для преобразования объекта в JsonElement в качестве массива д. итерируйте и обновляйте JsonObject по мере необходимости е. преобразовать обновленный JsonElement в вывод String.

Рабочий код ниже:

 Gson gson = new Gson();
 String jsonOutput = "{\"products\": [{ \"name\" : \"ABC\" ,\"desc\" : \"abcde\", \"Quantity\": \"2\"}]}";
 Products products = gson.fromJson(jsonOutput, Products.class);
 System.out.println(products);

 JsonElement jsonElement = gson.toJsonTree(products);
 JsonArray jsonArray = jsonElement.getAsJsonObject().get("products").getAsJsonArray();
 for (JsonElement ele : jsonArray) {
     JsonObject obj = ele.getAsJsonObject();
     obj.addProperty("matcode", "001100");
 }
 String updatedJsonOutput = gson.toJson(jsonElement); 
 System.out.println("Updated json Object: " + updatedJsonOutput);
0 голосов
/ 14 июня 2019

Если вы используете hql, вы можете сделать это следующим образом:

@Entity
@Table(name = "product")
public class Product {

      @Column(name = "name")
      private String name;

      @Column(name = "desc")
      private String desc;

      @Column(name = "quantity")
      private Integer quantity;

      @Transient
      @Column(name = "quantity")
      private String matcode;

      public Product(String name, String desc, Integer quantity, String matcode) {
         this.name = name;
         this.desc = desc;
         this.quantity = quantity;
         this.matcode = matcode;
     }

}

Если вы хотите узнать больше о Transient аннотации, пожалуйста, следуйте Transient Attribute

...