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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用杰克遜反序列化為字符串或?qū)ο?/h1>

我有一個對象,有時看起來像這樣:{   "foo" : "bar",   "fuzz" : "bla"}有時看起來像這樣:{   "foo" : { "value" : "bar", "baz": "asdf" },   "fuzz" : { "thing" : "bla", "blip" : "asdf" }}這些類將如下所示:public class Foo {   String value;   String baz;}public class Fuzz {   String thing;   String blip;}其中第一種情況是第二種情況的簡寫。我想始終反序列化到第二種情況。此外 - 這是我們代碼中非常常見的模式,所以我希望能夠以通用方式進行序列化,因為還有其他類似于上面的類具有相同的模式,即使用String作為更復雜的對象的語法糖。Foo我想象使用它的代碼看起來像這樣public class Thing {   @JsonProperty("fuzz")  Fuzz fuzz;  @JsonProperty("foo")  Foo foo;}如何編寫一個自定義反序列化程序(或其他一些模塊)來一般處理這兩種情況?
查看完整描述

1 回答

?
GCT1015

TA貢獻1827條經(jīng)驗 獲得超4個贊

為了使其通用,我們需要能夠指定要在對象中為 設(shè)置的名稱。一定的靈活性提供了注釋方法。讓我們定義簡單的注釋:JSON primitive


@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

@interface JsonPrimitiveName {

    String value();

}

名稱的意思是:如果基元將出現(xiàn)在使用中獲取給定基元的屬性名稱。它與字段綁定。簡單的去鈰化器,可處理和:JSONvalue()JSON primitivePOJOJSON objectJSON primitive


class PrimitiveOrPojoJsonDeserializer extends JsonDeserializer implements ContextualDeserializer {


    private String primitiveName;

    private JavaType type;


    @Override

    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {

        JsonDeserializer<Object> deserializer = ctxt.findRootValueDeserializer(type);

        if (p.currentToken() == JsonToken.START_OBJECT) {

            return deserializer.deserialize(p, ctxt);

        } else if (p.currentToken() == JsonToken.VALUE_STRING) {

            BeanDeserializer beanDeserializer = (BeanDeserializer) deserializer;

            try {

                Object instance = beanDeserializer.getValueInstantiator().getDefaultCreator().call();

                SettableBeanProperty property = beanDeserializer.findProperty(primitiveName);

                property.deserializeAndSet(p, ctxt, instance);

                return instance;

            } catch (Exception e) {

                throw JsonMappingException.from(p, e.getMessage());

            }

        }


        return null;

    }


    @Override

    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {

        JsonPrimitiveName annotation = property.getAnnotation(JsonPrimitiveName.class);


        PrimitiveOrPojoJsonDeserializer deserializer = new PrimitiveOrPojoJsonDeserializer();

        deserializer.primitiveName = annotation.value();

        deserializer.type = property.getType();


        return deserializer;

    }

}

現(xiàn)在我們需要按如下方式對字段進行注釋:POJO


class Root {


    @JsonPrimitiveName("value")

    @JsonDeserialize(using = PrimitiveOrPojoJsonDeserializer.class)

    private Foo foo;


    @JsonPrimitiveName("thing")

    @JsonDeserialize(using = PrimitiveOrPojoJsonDeserializer.class)

    private Fuzz fuzz;


    // getters, setters

}

我假設(shè)所有類都是 -s 并遵循所有規(guī)則 - have 和默認構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不存在,您需要以某種方式更改此行以符合您的要求。POJOgetterssettersbeanDeserializer.getValueInstantiator().getDefaultCreator().call()


示例應(yīng)用:


import com.fasterxml.jackson.core.JsonParser;

import com.fasterxml.jackson.core.JsonToken;

import com.fasterxml.jackson.databind.BeanProperty;

import com.fasterxml.jackson.databind.DeserializationContext;

import com.fasterxml.jackson.databind.JavaType;

import com.fasterxml.jackson.databind.JsonDeserializer;

import com.fasterxml.jackson.databind.JsonMappingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import com.fasterxml.jackson.databind.deser.BeanDeserializer;

import com.fasterxml.jackson.databind.deser.ContextualDeserializer;

import com.fasterxml.jackson.databind.deser.SettableBeanProperty;


import java.io.File;

import java.io.IOException;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


public class JsonApp {


    public static void main(String[] args) throws Exception {

        File jsonFile = new File("./resource/test.json").getAbsoluteFile();


        ObjectMapper mapper = new ObjectMapper();

        System.out.println(mapper.readValue(jsonFile, Root.class));

    }

}

打印縮短 :JSON


Root{foo=Foo{value='bar', baz='null'}, fuzz=Fuzz{thing='bla', blip='null'}}

對于完整有效載荷:JSON


Root{foo=Foo{value='bar', baz='asdf'}, fuzz=Fuzz{thing='bla', blip='asdf'}}


查看完整回答
反對 回復 2022-09-14
  • 1 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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