Как мне создать Json Array в Java8 и печатать json, только если я установил для него значение? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь сгенерировать следующее, используя fasterxml jackson .. но я застрял.Я не могу понять, как создавать массивы.

{
   "setAccId":"12345",
   "groupOf":null,
   "isEnabled":false,
   "list":[
      {
         "student":"jim",
         "type":"S_A",
         "retro":null
      },
      {
         "student":"bob",
         "type":"S_A",
         "retro":null
      }
   ],
   "sort":[]
}

У меня есть два класса.У одного свойства Json, а у другого я его печатаю.

Ниже класса (DynamicJsonHelper) у меня есть все свойства json

package com.company.jsonfc;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({
"accId",
"groupOf",
"isEnabled"
})

public class DynamicJsonHelper {

    public String accId;
    public String groupOf;
    public List studentList;

    @JsonProperty("accId")
    public void setAccId(String accId) {
        this.accId = accId;
    }

    @JsonProperty("groupOf")
    public void setGroupOf(String groupOf) {
        this.groupOf = groupOf;
    }

    @JsonProperty("isEnabled")
    public boolean isEnabled() {
        return false;
    }

    @JsonProperty("studentList")
    public List<StudentList> studentList() {
        return studentList;
    }

}

Class List Class (как предложено)

class StudentList {
    String student;
    String type;
    String retro; 
}

А вот класс (PrintJson), где я его называю.

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;

import com.company.jsonfc.DynamicJsonHelper;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class PrintJson {

    @Test
    public void create_json() throws JsonProcessingException {
    final JsonNodeFactory factory = JsonNodeFactory.instance;

    DynamicJsonHelper dynamicJsonHelper = new DynamicJsonHelper();
    String jsonString;
    ObjectMapper mapper = new ObjectMapper();

    dynamicJsonHelper.setAccId("12345");

    jsonString = mapper.writeValueAsString(dynamicJsonHelper);
    System.out.println(jsonString);
    }

}

В результате получается следующее:

{
   "setAccId":"12345",
   "groupOf":null,
   "isEnabled":false
   "studentList":null
}

1) Как добавить список: [...] массив и сортировку: [] в конце тоже?

2) В классе PrintJson я не устанавливаю значение для groupOf, но оно все еще создается в Json.Как мне установить его, чтобы, если я установил значение, оно печаталось ... в противном случае оно не включается в печатаемый файл json.

Я был бы признателен, если бы вы взяли мой код и привели мне пример на основеэто для лучшего понимания, пожалуйста

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

1) Как добавить список: [...] массив и сортировку: [] в конце тоже?

Ответ : ВыМожно создать еще два класса: один для list и один для sort.Теперь в классе DynamicJsonHelper вы можете добавить их обоих, как вы добавили accId или isEnabled, и они будут напечатаны.Обязательно добавьте нужные поля в качестве переменных экземпляра в обоих классах.Например, для списка вы можете иметь такой класс:

class StudentList{
    String student;
    String type;
    String retro;
}

Теперь добавьте поле в вашем классе DynamicJsonHelper как List<StudentList>.Точно так же вы можете сделать для sort.

2) В классе PrintJson я не устанавливаю значение для groupOf, но оно все еще создается в Json.Как мне установить его так, если я установлю значение, оно будет напечатано ... в противном случае оно не будет включено в распечатываемый файл json.

Ответ : Вы можете либо используйте Object mapper и установите его так, чтобы он игнорировал пустые поля во время сериализации.Например: mapper.setSerializationInclusion(Include.NON_NULL); или вы можете установить его на уровне класса, чтобы игнорировать нулевые значения, если таковые имеются.Например:

@JsonInclude(Include.NON_NULL)
class Test
{
  String t;
}

Как упомянуто в комментариях aBnormaLz выше, не работает, если тип примитивен, как у isEnabled.Поэтому попробуйте изменить его на Boolean и убедитесь, что то же самое для других полей.

Редактировать:

@JsonPropertyOrder({
"accId",
"groupOf",
"isEnabled"
})
@JsonInclude(JsonInclude.Include.NON_NULL)

public class DynamicJsonHelper {

public String accId;
public String groupOf;
public List<Student> studentList;

@JsonProperty("accId")
public void setAccId(String accId) {
    this.accId = accId;
}

@JsonProperty("groupOf")
public void setGroupOf(String groupOf) {
    this.groupOf = groupOf;
}

@JsonProperty("isEnabled")
public boolean isEnabled() {
    return false;
}

@JsonProperty("studentList")
public void setStudentList(List<Student> list) {
    this.studentList = list;
}

}

class Student {
private String student;
private String type;
private String retro; 

public Student(String student, String type, String retro) {
    this.student = student;
    this.type = type;
    this.retro = retro;
}

public String getStudent() {
    return student;
}

public void setStudent(String student) {
    this.student = student;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getRetro() {
    return retro;
}

public void setRetro(String retro) {
    this.retro = retro;
}    
}

class HelperTest{

public static void main(String[] args) throws JsonProcessingException {
    DynamicJsonHelper dynamicJsonHelper = new DynamicJsonHelper();
    String jsonString;
    ObjectMapper mapper = new ObjectMapper();

    dynamicJsonHelper.setAccId("12345");

    List<Student> list = Arrays.asList(new Student("s1", "t1", "r1"), new Student("s2", "t2", "r2"));

    dynamicJsonHelper.setStudentList(list);
    jsonString = mapper.writeValueAsString(dynamicJsonHelper);
    System.out.println(jsonString);

}
}

После выполнения программы output выглядит следующим образом:

{
   "accId": "12345",
   "isEnabled": false,
   "studentList": [
                    {
                      "student": "s1",
                      "type": "t1",
                      "retro": "r1"
                    },
                    {
                      "student": "s2",
                      "type": "t2",
                      "retro": "r2"
                    }
                   ]
}
0 голосов
/ 19 декабря 2018

Вы пропустили пункт, что у вас должен быть третий класс, и он должен иметь свойство типа java.util.List или список массивов и имен для вашего примера.

например

public class JsonHolder {
    // appropriate Json/Jackson annotations ommitted

     private String  setAccId;
     private String  groupOf;
     private boolean isEnabled;
     private List<DynamicJsonHelper>  list;
     private String[] sort;

     // .. getter/setters ...

}

тогда вам нужно создать этот объект, и когда вы создали свой DynamicJsonHelper, поместите его в список или массив.

В конце концов вы можете сериализовать объект JsonHolder и увидите свой список Java или массивкак массив JSON.

UPD: просто обратите внимание, что в структуре JSON, например, { ... } - это объект, а в Java должен быть класс для него.

Итак, начиная со структуры JSON, которую вы разместили

{
  "setAccId":"12345",
  "groupOf":null,
  "isEnabled":false,
  "list":[
   {
     "student":"jim",
     "type":"S_A",
     "retro":null
  },
  {
     "student":"bob",
     "type":"S_A",
     "retro":null
  }
 ],
 "sort":[]
}

это объект (пусть его назовут JsonHolder) со свойствами с именем setAcctId, groupOf, isEnabled, list, sort Так что вам нужно иметь класс Java для него (аналогично тому, как вы делали это для DynamicJsonHelper. Вы можетеиспользуйте любые аннотации @Json, которые вы хотели бы, таким же образом (я их пропустил и оставил для вас). Даже у вас их не будет Джексон или любой другой сериализатор JSON будет использовать имена свойств в классе Java по умолчанию.

Я имею в виду, например, выr @JsonProperty ("accId")

@JsonProperty("accId")
public void setAccId(String accId)

не требуется, если getter / setter / property назван также getAcctId, setAcctId, acctId.Джексон будет использовать это, если нет аннотации @JsonProperty.

Кстати, лучше сделать это так, как вы делали это для удобства чтения кода.: -)

По вашему вопросу: list и sort свойства в JSON являются массивами.Джексон анализирует классы коллекций Java, такие как List, Set или Arrays, в массивы JSON.

Затем в соответствии с требуемой структурой JSON свойство list представляет собой такую ​​коллекцию объектов DynamicJsonHelper, которые вы создали.в классе Java, List или Array - ваш выбор - используйте то, что вам больше подходит.Я рекомендую использовать список, а не массив.Работа с массивами в Java не очень хорошая идея.: -)

Итак, вы только что создали класс Java DynamicJsonHelper только для объектов, которые должны находиться в list свойстве объекта JsonHolder.Осталось создать этот класс "JsonHolder" и передать этот объект Джексону, чтобы сериализовать его в требуемую структуру JSON.

Существует множество аннотаций @Json, которые можно использовать, чтобы разрешить или нет null или пустые значения.изменить имена свойств, исключить сериализацию свойств класса Java и т. д., и т. д. Все в ваших руках ... удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...