2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
編輯:和 之間有細(xì)微的區(qū)別。
同時(shí)能夠區(qū)分和與2.7.*2.9.*2.9.*doublefloat
getDoubleValue()
getFloatValue()
而是只使用2.7.*
getDoubleValue()
即使是代幣。
因此,您需要決定是否要保持逆向兼容性。ID_NUMBER_FLOAT
您也可以覆蓋兩者,就像我在這里所做的那樣。
這就是您的定制所需的全部?jī)?nèi)容MyParser
static class MyParser extends JsonParserDelegate {
MyParser(final JsonParser delegate) {
super(delegate);
}
@Override
public String getText() throws IOException {
final String text = super.getText();
if ("name".equals(getCurrentName())) {
return text + "-3";
}
return text;
}
@Override
public JsonToken nextToken() throws IOException {
if ("price".equals(getCurrentName())) {
// Advance token anyway
super.nextToken();
return JsonToken.VALUE_NUMBER_FLOAT;
}
return super.nextToken();
}
@Override
public int getCurrentTokenId() {
try {
if ("price".equals(getCurrentName())) {
return JsonTokenId.ID_NUMBER_FLOAT;
}
} catch (final IOException e) {
//
}
return super.getCurrentTokenId();
}
@Override
public NumberType getNumberType() throws IOException {
if ("price".equals(getCurrentName())) {
return NumberType.FLOAT;
}
return super.getNumberType();
}
@Override
public float getFloatValue() throws IOException {
return Float.parseFloat(getValueAsString("0")) + 0.09F;
}
@Override
public double getDoubleValue() throws IOException {
return Double.parseDouble(getValueAsString("0")) + 0.09D;
}
}
輸出:{"name":"xyz-3","price":90.09}
您的代碼看起來(lái)很好,并且已經(jīng)過(guò)測(cè)試并;)

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
您是否真的確定,關(guān)于關(guān)注點(diǎn)分離,在解析的數(shù)據(jù)中混合解析和更改是一個(gè)好主意?
如果您仍然想這樣做,則可以使用自定義反序列化程序,并按照所需的方式處理所需的字段名稱(chēng)和類(lèi)型,例如:
class CustomDeserializer extends StdDeserializer<Entity> {
public CustomDeserializer(Class<Entity> t) {
super(t);
}
@Override
public Entity deserialize(JsonParser jp, DeserializationContext dc) throws IOException {
String name = null;
float price = 0;
JsonToken currentToken = null;
while ((currentToken = jp.nextValue()) != null) {
switch (currentToken) {
case VALUE_STRING:
switch (jp.getCurrentName()) {
case "name":
name = jp.getText() + "-3"; // change this text to whatever you want;
break;
case "price":
price = Float.parseFloat(jp.getText()); // parse
break;
default:
break;
}
break;
default:
break;
}
}
return new Entity(name, price);
}
}
注冊(cè)自定義反序列化程序后,它可以在您想要的任何對(duì)象映射器上運(yùn)行:
@Test
public void customDeserialization() throws IOException {
// given
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Entity.class, new CustomDeserializer(Entity.class));
mapper.registerModule(module);
// when
Entity entity = mapper.readValue("{\"name\":\"xyz\",\"price\":\"90.00\"}", Entity.class);
// then
assertThat(entity.getName()).isEqualTo("xyz-3");
assertThat(entity.getPrice()).isEqualTo(90f);
}
添加回答
舉報(bào)