【问题标题】:Generating json-schema for customly serialized beans为自定义序列化 bean 生成 json-schema
【发布时间】:2015-05-21 11:32:41
【问题描述】:

我正在使用 FasterXML 的 json-schema generator 从我的 POJO 构建 json-schema。 一切正常,直到我的 POJO 使用自定义 json 序列化。就我而言,我有一个 org.joda.Money 类型的字段,并使用相应的 joda-module 对其进行序列化。 bean 被很好地序列化了

{
  "amount": "...",
  "currency": "..."
}

但它的架构是这样的:

{
  "type" : "object",
  "id" : "urn:jsonschema:org:joda:money:Money",
  "properties" : {
    "amount" : {
      "type" : "number"
    },
    "amountMinorLong" : {
      "type" : "integer"
    },
    "scale" : {
      "type" : "integer"
    },
    "minorPart" : {
      "type" : "integer"
    },
    "positive" : {
      "type" : "boolean"
    },
    "amountMajor" : {
      "type" : "number"
    },
    "amountMinor" : {
      "type" : "number"
    },
    "amountMinorInt" : {
      "type" : "integer"
    },
    "positiveOrZero" : {
      "type" : "boolean"
    },
    "zero" : {
      "type" : "boolean"
    },
    "negative" : {
      "type" : "boolean"
    },
    "amountMajorLong" : {
      "type" : "integer"
    },
    "amountMajorInt" : {
      "type" : "integer"
    },
    "negativeOrZero" : {
      "type" : "boolean"
    },
    "currencyUnit" : {
      "type" : "object",
      "id" : "urn:jsonschema:org:joda:money:CurrencyUnit",
      "properties" : {
        "symbol" : {
          "type" : "string"
        },
        "numeric3Code" : {
          "type" : "string"
        },
        "countryCodes" : {
          "type" : "array",
          "items" : {
            "type" : "string"
          }
        },
        "code" : {
          "type" : "string"
        },
        "decimalPlaces" : {
          "type" : "integer"
        },
        "defaultFractionDigits" : {
          "type" : "integer"
        },
        "currencyCode" : {
          "type" : "string"
        },
        "pseudoCurrency" : {
          "type" : "boolean"
        },
        "numericCode" : {
          "type" : "integer"
        }
      }
    }
  }
}

有没有办法自定义生成的架构?

【问题讨论】:

  • 我想知道您使用哪个模块对 Joda Money 进行序列化和反序列化?
  • 这里是:<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-joda</artifactId> <version>2.4.4</version> </dependency>
  • 我认为它不包含 Joda Money 模块。看我的回答。

标签: json jackson jsonschema fasterxml jackson-modules


【解决方案1】:

我认为jackson-datatype-joda 不支持 Joda Money 数据类型。

你可以试试我自己的模块。我不确定它是否可以与模式生成一起使用,但它可以很好地用于序列化/反序列化。

public class JodaMoneyModule extends SimpleModule {

    @Override
    public void setupModule(final SetupContext context) {
        final SimpleSerializers serializers = new SimpleSerializers();
        serializers.addSerializer(Money.class, new JodaMoneySerializer());
        context.addSerializers(serializers);
        final SimpleDeserializers deserializers = new SimpleDeserializers();
        deserializers.addDeserializer(Money.class, new JodaMoneyDeserializer());
        context.addDeserializers(deserializers);
    }

    private class JodaMoneySerializer extends JsonSerializer<Money> {
        @Override
        public void serialize(
                final Money value,
                final JsonGenerator gen,
                final SerializerProvider serializers)
                throws IOException {
            gen.writeString(value == null ? null : value.toString());
        }
    }

    private class JodaMoneyDeserializer extends JsonDeserializer<Money> {

        @Override
        public Money deserialize(final JsonParser p, final DeserializationContext ctxt)
                throws IOException {
            final String value = p.getValueAsString();
            return value == null ? null : Money.parse(value);
        }
    }
} 

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2011-11-12
    • 2011-02-25
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多