第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在從杰克遜中的字符串構(gòu)造 JsonNode 時(shí)更改其值

如何在從杰克遜中的字符串構(gòu)造 JsonNode 時(shí)更改其值

烙印99 2022-09-14 16:21:04
我有一個(gè) JSON 字符串,我想在使用杰克遜庫(kù)構(gòu)造 JsonNode 時(shí)更改該值。例如:-input: {"name":"xyz","price":"90.00"}output:{"name":"xyz-3","price":90.90}我創(chuàng)建了自己的 JsonFactory 并傳遞了自己的解析器。但我只能更改鍵,而不能更改與鍵關(guān)聯(lián)的值。法典:private static ObjectMapper create() {        ObjectMapper objectMapper = new ObjectMapper(new JsonFactory() {            @Override            protected JsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) throws IOException {                return new MyParser(super._createParser(data, offset, len, ctxt));            }            @Override            protected JsonParser _createParser(InputStream in, IOContext ctxt) throws IOException {                return new MyParser(super._createParser(in, ctxt));            }            @Override            protected JsonParser _createParser(Reader r, IOContext ctxt) throws IOException {                return new MyParser(super._createParser(r, ctxt));            }            @Override            protected JsonParser _createParser(char[] data, int offset, int len, IOContext ctxt, boolean recyclable)                    throws IOException {                return new MyParser(super._createParser(data, offset, len, ctxt, recyclable));            }        });private static final class MyParser extends JsonParserDelegate {        private MyParser(JsonParser d) {            super(d);        }        @Override        public String getCurrentName() throws IOException, JsonParseException {            ....        }        @Override        public String getText() throws IOException, JsonParseException {           ...        }        @Override        public Object getCurrentValue() {            ...        }        @Override        public String getValueAsString() throws IOException {            ...        }在這種情況下,當(dāng)調(diào)用 readTree 方法或未調(diào)用方法時(shí),我無(wú)法在創(chuàng)建 JsonNode 本身時(shí)更改值。此外,json 字符串也可以不同。基本上,我想從字符串構(gòu)造一個(gè) JsonNode。因此,在這里綁定到特定的模式/bean 不是一個(gè)好的選擇。如何解決這個(gè)問(wèn)題?蒂亞getCurrentValuegetValueAsString
查看完整描述

2 回答

?
jeck貓

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è)試并;)


查看完整回答
反對(duì) 回復(fù) 2022-09-14
?
慕田峪9158850

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);

    }


查看完整回答
反對(duì) 回復(fù) 2022-09-14
  • 2 回答
  • 0 關(guān)注
  • 181 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)