Пытаетесь создать объект json в Java, но получаете вложенный массив?Как это сделать лучше? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь получить этот вывод:

{
   "columnNames":[
      "fruit"
   ],
   "values":[
      [
         "Apple is green"
      ]
   ],
   "time":"2017-12-11T00:00:00Z"
}

Но я получаю следующее:

{
   "columnNames":[
      "fruit"
   ],
   "values":[
      [
         {
            "stringValue":"Apple is green",
            "intValue":0,
            "booleanValue":false
         }
      ]
   ],
   "time":null
}

Вот мой код (пока что) и я был бы признателен, если бы вы могли сказать мне, где я иду не так?

public static void main(String[] args) {
    List<String> columnNames = new ArrayList<>();
    columnNames.add("fruit");
    List<List<ResponseValues>> responseValues = new ArrayList<>();
    List<ResponseValues> values = Collections.singletonList(new ResponseValues("Apple is green"));
    responseValues.add(values);

    String expectedResult = createAJson(columnNames, responseValues);
    System.out.println(expectedResult);
}


public static String createAJson(List<String> columnNames, List<List<ResponseValues>> values) {
    String jsonBlock = "";
    repBuilder repBuilder = new repBuilder();
    ObjectMapper mapper = new ObjectMapper();

    repBuilder.setColumnNames(columnNames);
    repBuilder.setValues(values);

    try {
        jsonBlock = mapper.writeValueAsString(repBuilder);
    }
    catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return jsonBlock;
}

И какой-нибудь код котельной плиты для создания секции значений отклика:

@JsonPropertyOrder({
"columnNames",
"values",
"time"
})

public class RepBuilder {

    public List<String> columnNames;
    public List<List<ResponseValues>> values;
    private String time;

    @JsonProperty("columnNames")
    public List<String> getColumnNames() {
        return columnNames;
    }

    @JsonProperty("columnNames")
    public void setColumnNames(List<String> columnNames) {
        this.columnNames = columnNames;
    }

    @JsonProperty("values")
    public List<List<ResponseValues>> getValues() {
        return values;
    }

    @JsonProperty("values")
    public void setValues(List<List<ResponseValues>> values) {
        this.values = values;
    }

    @JsonProperty("time")
    public String gettime() {
        return time;
    }

    @JsonProperty("time")
    public void settime(String time) {
        this.time = time;
    }

}

И значения ответа: Это было сделано таким образом, чтобы я мог установить STRING или INTEGER или BOOLEAN и добавить в список?

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

    private String stringValue;
    private int intValue;
    private boolean booleanValue;

    public ResponseValues(String stringValue) {
        this.stringValue = stringValue;
    }

    public ResponseValues(int intValue) {
        this.intValue = intValue;
    }

    public ResponseValues(boolean booleanValue) {
        this.booleanValue = booleanValue;
    }

    public String getStringValue() {
        return stringValue;
    }

    public void setStringValue(String stringValue) {
        this.stringValue = stringValue;
    }

    public int getIntValue() {
        return intValue;
    }

    public void setIntValue(int intValue) {
        this.intValue = intValue;
    }

    public boolean getBooleanValue() {
        return booleanValue;
    }

    public void setBooleanValue(boolean booleanValue) {
        this.booleanValue = booleanValue;
    }
}

Может кто-нибудь указать, кто яотсутствует?Я также пытался использовать @JsonProperty(access = JsonProperty.Access.WRITE_ONLY), но это не работает для меня, какие-нибудь другие идеи? Буду признателен, если вы используете мой код в контексте вашего ответа (так как я все еще изучаю Java)

Ответы [ 2 ]

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

Пользовательский сериализатор для ResponseValues, например:

public class ResponseSerializer extends JsonSerializer<ResponseValues>{ 

    @Override
    public void serialize(ResponseValues responseValues, JsonGenerator gen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {

        gen.writeString(responseValues.getStringValue());
    }

}

и использование его с аннотацией:

@JsonSerialize(using = ResponseSerializer.class)
public class ResponseValues

Обновление

Если вам нужно проверить ихпо порядку, вы можете сделать это так:

@Override
public void serialize(ResponseValues responseValues, JsonGenerator gen,
        SerializerProvider provider) throws IOException,
        JsonProcessingException {

    String stringValue = responseValues.getStringValue();
    if (stringValue != null) {
        gen.writeString(responseValues.getStringValue());
        return; // if string value is valid, write it and return
    }

    int intValue = responseValues.getIntValue();
    // let's suppose 0 is not a valid status
    if (intValue != 0) { 
        gen.writeNumber(intValue);
        return;
        // also you can use gen.writeString(String.valueOf(intValue)); if you need a String
    }

    boolean booleanValue = responseValues.getBooleanValue();
    gen.writeBoolean(booleanValue);

}
0 голосов
/ 31 декабря 2018
private int intValue;
private boolean booleanValue;

Это (int, boolean) примитивы, поэтому они по умолчанию инициализируются со значениями по умолчанию 0 и false соответственно.Вы можете использовать

private Integer intValue;
private Boolean booleanValue;

и настроить модуль записи на игнорирование нулевых значений.Кроме того, я не вижу, где вы устанавливаете «время».Поскольку он имеет тип String, по умолчанию он имеет значение null.

Последнее посещение Предложение, поскольку вы изучаете Java,

  • Начинайте названия классов с заглавной буквы.Изменение repBuilder -> RepBuilder
  • Мне понравился ваш Collections.singletonList (), и ваши усилия очевидны в вашем вопросе.Продолжайте расти!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...