Как убрать обратную косую черту для цитат из JsonSchema?

У меня есть класс:

class Setting {

    String configurationName;
    String configuration; 
} 

Я хочу вернуть строковое представление того, как будет выглядеть конфигурация. Это может быть другой объект в зависимости от некоторых условий.

В одном из сервисов я делаю ниже:

@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getConfigurationSetting ()
{
    try {

        Setting settingPojo = new Setting();
        settingPojo.setCOnfigurationName("DataBase");

        ObjectMapper mapper = new ObjectMapper();

        SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();

        mapper.acceptJsonFormatVisitor(OracleConfiguration.class, visitor);

        JsonSchema schema = visitor.finalSchema();

        settingPojo.setConfiguraton(mapper.writeValueAsString(schema));

        return Response.status(HTTP.CodeOK).entity(settingPojo).build();
    } catch (Exception ex) {
        // exception logic
    }
}

Может быть другой класс: MySQLConfiguration.class.

Образец :

{
    configurationName : "DataBase",
    configuration: "{
       \"type\":\"object\",
       \"id\":\"urn\":\"jsonschema\":\"database\":\"model\":\"OracleConfiguration\",
       \"properties\":{
          \"numberOfConnection\":{
             \"type\":\"integer\"
          },
          \"connectionDate\":{
             \"type\":\"integer\",
             \"format":\"utc-millisec\"
          },
          \"isconnected\":{
             \"type\":\"boolean\"
          }
       }
    }"
}
  

Проблемы с приведенным выше выводом:

  1. Я хочу удалить свойство id из строки.
  2. Я получаю эту странную дополнительную обратную косую черту для escape-символа. Я не вижу этого при отладке и выполнении этой строки: mapper.writeValueAsString(schema). Но я вижу обратную косую черту и дополнительные кавычки после того, как я установил свойство.

Есть идеи, как их решить?


person MrA    schedule 02.07.2021    source источник
comment
Прекратите двойное кодирование вашего JSON.   -  person chrylis -cautiouslyoptimistic-    schedule 03.07.2021
comment
@chrylis-cautiouslyoptimistic- спасибо за ответ .. не понял вас .. что вы имеете в виду, остановить двойное кодирование json? Я хочу показать пользователю, какой тип данных будет у этого класса.   -  person MrA    schedule 03.07.2021
comment
JsonSchema объект кодируется два раза. Первый раз кодируется непосредственно вами: mapper.writeValueAsString(schema). Второй раз он кодируется Spring. Измените тип с String на Object - Object configuration; и в контроллере просто установите его без дополнительной сериализации: settingPojo.setConfiguraton(schema);   -  person Michał Ziober    schedule 06.07.2021


Ответы (1)


  1. Вы можете поручить Jackson удалить id с помощью функции MixIn. Взгляните на пример.
  2. Объект сериализуется дважды, один раз непосредственно вами в методе контроллера, второй - Spring.

В вашем примере вам нужно:
Использовать аннотацию @JsonRawValue в классе Setting:

class Setting {
    String configurationName;

    @JsonRawValue
    String configuration;
}

Создайте MixIn abstract class:

abstract class JsonSchemaWithoutId {

    @JsonIgnore
    public String id;

    @JsonIgnore
    public abstract String getId();
}

Простое использование:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
import lombok.Data;

import java.io.File;
import java.io.IOException;

public class JsonMixInAndSchemaApp {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.addMixIn(JsonSchema.class, JsonSchemaWithoutId.class);

        Setting settingPojo = new Setting();
        settingPojo.setConfigurationName("Setting");

        SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
        mapper.acceptJsonFormatVisitor(Setting.class, visitor);
        JsonSchema schema = visitor.finalSchema();

        settingPojo.setConfiguration(mapper.writeValueAsString(schema));

        mapper.writeValue(System.out, settingPojo);
    }
}

Над печатью кода

{
  "configurationName" : "Setting",
  "configuration" : {
  "type" : "object",
  "properties" : {
    "configurationName" : {
      "type" : "string"
    },
    "configuration" : {
      "type" : "string"
    }
  }
}
}
person Michał Ziober    schedule 06.07.2021