আমি জ্যাকসনের একটি কাস্টম ডিসরিয়ালাইজারের ডিফল্ট ডিসরিযালারকে কীভাবে কল করব


107

জ্যাকসনে আমার কাস্টম ডিসরিয়ালাইজারে আমার একটি সমস্যা আছে। আমি যে ডিভাইসটি ডিসরিয়ালাইজ করছি তাতে পপুলেট করার জন্য আমি ডিফল্ট সিরিয়ালটিকে অ্যাক্সেস করতে চাই। জনসংখ্যার পরে আমি কিছু কাস্টম জিনিস করব তবে প্রথমে আমি ডিফল্ট জ্যাকসন আচরণের মাধ্যমে অবজেক্টটির ডিসিসিয়ালাইজ করতে চাই।

এই মুহুর্তে আমার এই কোডটি।

public class UserEventDeserializer extends StdDeserializer<User> {

  private static final long serialVersionUID = 7923585097068641765L;

  public UserEventDeserializer() {
    super(User.class);
  }

  @Override
  @Transactional
  public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {

    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    User deserializedUser = null;
    deserializedUser = super.deserialize(jp, ctxt, new User()); 
    // The previous line generates an exception java.lang.UnsupportedOperationException
    // Because there is no implementation of the deserializer.
    // I want a way to access the default spring deserializer for my User class.
    // How can I do that?

    //Special logic

    return deserializedUser;
  }

}

আমার যা প্রয়োজন তা হ'ল ডিফল্ট ডিসরিয়ালাইজারকে আরম্ভ করার একটি উপায় যাতে আমি আমার বিশেষ যুক্তি শুরু করার আগে আমার পজোকে প্রাক-জনবসতি করতে পারি।

কাস্টম ডিসরিয়ালাইজারের মধ্যে থেকে ডিসিরিজাল কল করার সময় মনে হয় পদ্ধতিটি বর্তমান প্রসঙ্গ থেকে বলা হয়েছিল আমি সিরিয়ালাইজার শ্রেণি যেভাবেই নির্মাণ করি না কেন। আমার পোষ্টোতে টীকা দেওয়ার কারণে। এটি সুস্পষ্ট কারণে স্ট্যাক ওভারফ্লো ব্যতিক্রম ঘটায়।

আমি একটি সূচনা করার চেষ্টা করেছি BeanDeserializerতবে প্রক্রিয়াটি অত্যন্ত জটিল এবং এটি করার সঠিক উপায়টি আমি খুঁজে পেতে সক্ষম হইনি। আমি AnnotationIntrospectorএটিতে কোনও লাভও ওভারলোড করার চেষ্টা করেছিলাম না, ভেবেছিলাম যে এটি আমাকে এর মধ্যে থাকা টীকাকে উপেক্ষা করতে সহায়তা করতে পারে DeserializerContext। অবশেষে এটি seams আমি ব্যবহার করে কিছুটা সাফল্য JsonDeserializerBuildersপেয়েছি যদিও এটি আমাকে বসন্ত থেকে অ্যাপ্লিকেশন প্রসঙ্গে ধরে রাখতে কিছু যাদু স্টাফ করার প্রয়োজন ছিল। আমি এমন কোনও জিনিসের প্রশংসা করব যা আমাকে ক্লিনার সমাধানের দিকে নিয়ে যেতে পারে উদাহরণস্বরূপ আমি JsonDeserializerটীকাটি না পড়ে কীভাবে deserialization প্রসঙ্গটি তৈরি করতে পারি ।


4
না। এই পদ্ধতির সাহায্য করবে না: সমস্যাটি হ'ল আপনার সম্পূর্ণরূপে নির্মিত ডিফল্ট ডিসরিযায়ার প্রয়োজন হবে; এবং এটির জন্য এটি তৈরি করা দরকার এবং তারপরে আপনার ডিসিরিয়ালাইজার এতে প্রবেশ করে। DeserializationContextআপনি তৈরি বা পরিবর্তন করা উচিত এমন কিছু নয়; এটি সরবরাহ করা হবে ObjectMapperAnnotationIntrospectorএকইভাবে, অ্যাক্সেস পেতে সাহায্য করবে না।
StaxMan

শেষ পর্যন্ত কীভাবে শেষ করলেন?
খিতুরাস

ভাল প্রশ্ন. আমি নিশ্চিত নই তবে আমি নিশ্চিত যে নীচের উত্তর আমাকে সাহায্য করেছে। আমি বর্তমানে যে কোডটি লিখেছিলাম সেটির দখলে আমি নেই তবে আপনি যদি কোনও সমাধান পান তবে দয়া করে এটি অন্যের জন্য এখানে পোস্ট করুন।
পাবলো জোমার

উত্তর:


94

স্ট্যাক্সম্যান যেমন ইতিমধ্যে পরামর্শ দিয়েছে আপনি BeanDeserializerModifierএটি লিখে এবং এর মাধ্যমে নিবন্ধভুক্ত করে এটি করতে পারেন SimpleModule। নিম্নলিখিত উদাহরণে কাজ করা উচিত:

public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer
{
  private static final long serialVersionUID = 7923585097068641765L;

  private final JsonDeserializer<?> defaultDeserializer;

  public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer)
  {
    super(User.class);
    this.defaultDeserializer = defaultDeserializer;
  }

  @Override public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException
  {
    User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt);

    // Special logic

    return deserializedUser;
  }

  // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer
  // otherwise deserializing throws JsonMappingException??
  @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException
  {
    ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
  }


  public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException
  {
    SimpleModule module = new SimpleModule();
    module.setDeserializerModifier(new BeanDeserializerModifier()
    {
      @Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
      {
        if (beanDesc.getBeanClass() == User.class)
          return new UserEventDeserializer(deserializer);
        return deserializer;
      }
    });


    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);
    User user = mapper.readValue(new File("test.json"), User.class);
  }
}

ধন্যবাদ! আমি ইতিমধ্যে এটি অন্য উপায়ে সমাধান করেছি তবে আরও সময় পেলে আমি আপনার সমাধানটি সন্ধান করব।
পাবলো জোমর

5
একই সাথে কি করার উপায় আছে তবে JsonSerializer? আমার বেশ কয়েকটি সিরিয়ালাইজার রয়েছে তবে সেগুলির কোডটি প্রচলিত রয়েছে তাই আমি এটি উত্থাপন করতে চাই। আমি সরাসরি সিরিয়ালেজারে কল করার চেষ্টা করি কিন্তু ফলাফলটি
জেএসএনের ফলাফলটিতে আবৃত

4
@herau BeanSerializerModifier, ResolvableSerializerএবং ContextualSerializerম্যাচিং ইন্টারফেসগুলি ধারাবাহিকতাতে জন্য ব্যবহার করতে হয়।
স্ট্যাক্সমান

EE সংস্করণ ধারক (ওয়াইল্ডফ্লাই 10) এর জন্য এটি প্রযোজ্য? আমি জসনম্যাপিংএক্সেপশন পেয়েছি: (ছিল জাভা.লং.নুলপয়েন্টার এক্সসেপশন) (রেফারেন্স চেইনের মাধ্যমে: java.util.ArrayList [0])
ইউজার 1927033

প্রশ্নটি ব্যবহার করে readTree()কিন্তু উত্তর দেয় না। ডেরেক কোচরান পোস্ট করা বনাম এই পদ্ধতির সুবিধা কী ? এই কাজটি করার কোনও উপায় আছে readTree()?
গিলি

15

আমি কোন উত্তর পাওয়া উত্তর যা অনেক গৃহীত উত্তর চেয়ে বেশি পাঠযোগ্য।

    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
            User user = jp.readValueAs(User.class);
             // some code
             return user;
          }

এটি এর চেয়ে সহজতর হয় না।


হাই গিলি! এর জন্য ধন্যবাদ আমি প্রত্যাশা করছি যে লোকেরা এই উত্তরটি খুঁজে পাবে এবং এটিকে বৈধ করার জন্য সময় পাবে। এই মুহুর্তে আমি উত্তরটি গ্রহণ করতে পারছি না বলে আমি এখন আর তেমন করার মতো অবস্থানে নেই। যদি আমি দেখি যে লোকেরা এটি বলে একটি সম্ভাব্য সমাধান আমি অবশ্যই তাদের এটির দিকে গাইড করব। এটিও হতে পারে যে সমস্ত সংস্করণে এটি সম্ভব না। এখনও ভাগ করে নেওয়ার জন্য ধন্যবাদ।
পাবলো জোমর

জ্যাকসন ২.৯.৯ নিয়ে সংকলন করে না। JsonParser.readTree () বিদ্যমান নেই।
স্লিভ

@ ক্লেভ দেখতে একটি সাধারণ টাইপোর মতো লাগে। স্থির।
গিলি

এটি জ্যাকসন ২.১০ এর সাথে কাজ করে তা নিশ্চিত করতে পারেন, ধন্যবাদ!
স্টুয়ার্ট লেল্যান্ড-কোল

5
এটি কীভাবে কাজ করে তা আমি পাই না StackOverflowError, যেহেতু জ্যাকসন আবার একই সিরিয়ালাইজারটি ব্যবহার করবেন User...
16384

13

দ্য DeserializationContextএকটি আছে readValue()পদ্ধতি ব্যবহার করতে পারে। এটি ডিফল্ট ডিসরিয়ালাইজার এবং আপনার যে কোনও কাস্টম ডিসরিযালার উভয়েরই জন্য কাজ করা উচিত।

পাসটি পাস করার জন্য আপনি traverse()যে JsonNodeস্তরে পড়তে চান তা কল করতে ভুলবেন JsonParserনা readValue()

public class FooDeserializer extends StdDeserializer<FooBean> {

    private static final long serialVersionUID = 1L;

    public FooDeserializer() {
        this(null);
    }

    public FooDeserializer(Class<FooBean> t) {
        super(t);
    }

    @Override
    public FooBean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        FooBean foo = new FooBean();
        foo.setBar(ctxt.readValue(node.get("bar").traverse(), BarBean.class));
        return foo;
    }

}

DeserialisationContext.readValue () এর অস্তিত্ব নেই, এটি অবজেক্টম্যাপার একটি পদ্ধতি
পেড্রো বোর্জেস

এই সমাধানটি ভালভাবে কাজ করছে, তবে আপনি কোনও মান শ্রেণীর উদাহরণস্বরূপ ডেটক্লাস
revau.lt

9

এটি করার কয়েকটি উপায় রয়েছে তবে সঠিকভাবে এটি করতে আরও কিছু কাজ জড়িত। মূলত আপনি উপ-শ্রেণিবদ্ধকরণ ব্যবহার করতে পারবেন না, যেহেতু তথ্য ডিফল্ট ডিসারিয়ালাইজারগুলির প্রয়োজনীয়তা বর্গ সংজ্ঞা থেকে তৈরি করা হয়।

সুতরাং আপনি যা ব্যবহার করতে পারেন তা হ'ল একটি নির্মাণ করা BeanDeserializerModifier, Moduleইন্টারফেসের মাধ্যমে এটি ব্যবহার করুন (ব্যবহার SimpleModule)। আপনাকে সংজ্ঞায়িত / ওভাররাইড করতে হবে modifyDeserializerএবং নির্দিষ্ট ক্ষেত্রে যেখানে আপনি নিজের যুক্তি যুক্ত করতে চান (যেখানে টাইপ ম্যাচগুলি), নিজের ডিসরিয়ালাইজার তৈরি করতে, আপনাকে প্রদত্ত ডিফল্ট ডিসরিযালার পাস করতে। এবং তারপর ভিতরেdeserialize() পদ্ধতিতে আপনি কেবল কল অর্পণ করতে পারেন, ফলাফল অবজেক্টটি নিতে পারেন।

বিকল্পভাবে, যদি আপনাকে অবশ্যই অবজেক্টটি তৈরি এবং পপুলেট করতে হয় তবে আপনি এটি করতে পারেন এবং এর ওভারলোডেড সংস্করণটির কল করতে পারেন deserialize() তৃতীয় আর্গুমেন্টের ; মধ্যে deserialize আপত্তি।

কাজ করতে পারে এমন অন্য উপায় (তবে 100% নিশ্চিত নয়) হ'ল Converterঅবজেক্ট ( @JsonDeserialize(converter=MyConverter.class)) নির্দিষ্ট করা । এটি একটি নতুন জ্যাকসন ২.২ বৈশিষ্ট্য। আপনার ক্ষেত্রে, রূপান্তরকারী আসলে ধরণের রূপান্তরিত করবে না, তবে বস্তুটিকে সহজতর করবে: তবে আমি জানি না যে এটি আপনাকে যা করতে চায় ঠিক তাই করতে দেয়, যেহেতু ডিফল্ট ডিসারিয়ালাইজারকে প্রথমে ডাকা হত এবং কেবল তখনই আপনার Converter


আমার উত্তরটি এখনও দাঁড়িয়ে আছে: আপনাকে জ্যাকসনকে প্রতিনিধিদলের জন্য ডিফল্ট ডিজারিয়ালাইজারটি তৈরি করতে দেওয়া উচিত; এবং এটি "ওভাররাইড" করার একটি উপায় খুঁজে বের করতে হবে। BeanDeserializerModifierকলব্যাক হ্যান্ডলার যা এটির অনুমতি দেয়।
StaxMan

7

যদি আপনার অতিরিক্ত ব্যবহারকারীর ক্লাস ঘোষণা করা সম্ভব হয় তবে আপনি এন্টারটেশনগুলি ব্যবহার করে এটি প্রয়োগ করতে পারেন

// your class
@JsonDeserialize(using = UserEventDeserializer.class)
public class User {
...
}

// extra user class
// reset deserializer attribute to default
@JsonDeserialize
public class UserPOJO extends User {
}

public class UserEventDeserializer extends StdDeserializer<User> {

  ...
  @Override
  public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {
    // specify UserPOJO.class to invoke default deserializer
    User deserializedUser = jp.ReadValueAs(UserPOJO.class);
    return deserializedUser;

    // or if you need to walk the JSON tree

    ObjectMapper mapper = (ObjectMapper) jp.getCodec();
    JsonNode node = oc.readTree(jp);
    // specify UserPOJO.class to invoke default deserializer
    User deserializedUser = mapper.treeToValue(node, UserPOJO.class);

    return deserializedUser;
  }

}

4
হা. আমার পক্ষে কাজ করা একমাত্র পন্থা। ডিসিরিয়ালাইজারকে পুনরাবৃত্ত কল করার কারণে আমি স্ট্যাকওভারফ্লো এরিয়ার্স পাচ্ছিলাম।
সাইক্লভ

3

অবজেক্টম্যাপার ব্যবহার করে এখানে অনিলিয়ার রয়েছে

public MyObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    OMyObject object = new ObjectMapper().readValue(p, MyObject.class);
    // do whatever you want 
    return object;
}

এবং দয়া করে: স্ট্রিংয়ের মান বা অন্য কিছু ব্যবহার করার দরকার নেই। সমস্ত প্রয়োজনীয় তথ্য জসন পার্সার দিয়েছেন, তাই এটি ব্যবহার করুন।


এটি অবশ্যই আমি খুঁজে পেয়েছি সবচেয়ে সহজ সমাধান, তবে ObjectMapperকেবলমাত্র ডিফল্ট আচরণ ফিরে পেতে সম্পূর্ণ নতুন তৈরি করা ভুল বলে মনে হচ্ছে।
ড্যান লেন্সকি

3

কি লাইন বরাবর Tomáš Záluský সুপারিশ করেছে ক্ষেত্রে যেখানে ব্যবহারে, BeanDeserializerModifierঅবাঞ্ছিত আপনি নিজেকে deserializer একটি ডিফল্ট ব্যবহার গঠন করা যেতে পারে BeanDeserializerFactory, যদিও নেই কিছু অতিরিক্ত সেটআপ প্রয়োজন। প্রসঙ্গে, এই সমাধানটি এর মতো দেখায়:

public User deserialize(JsonParser jp, DeserializationContext ctxt)
  throws IOException, JsonProcessingException {

    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    User deserializedUser = null;

    DeserializationConfig config = ctxt.getConfig();
    JavaType type = TypeFactory.defaultInstance().constructType(User.class);
    JsonDeserializer<Object> defaultDeserializer = BeanDeserializerFactory.instance.buildBeanDeserializer(ctxt, type, config.introspect(type));

    if (defaultDeserializer instanceof ResolvableDeserializer) {
        ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
    }

    JsonParser treeParser = oc.treeAsTokens(node);
    config.initialize(treeParser);

    if (treeParser.getCurrentToken() == null) {
        treeParser.nextToken();
    }

    deserializedUser = (User) defaultDeserializer.deserialize(treeParser, context);

    return deserializedUser;
}

এটি জ্যাকসন ২.৯.৯ এর সাথে একটি স্বপ্নের মতো কাজ করে। এটি দেওয়া অন্যান্য উদাহরণের মতো স্ট্যাকওভারফ্লো এরিয়ারে ক্ষতিগ্রস্ত হয় না।
meta1203

1

BeanSerializerModifierএটি ব্যবহারে আমি ঠিক ছিলাম না কেননা এটি ObjectMapperকাস্টম ডিসরিয়ালাইজারের পরিবর্তে কেন্দ্রীয়ভাবে কিছু আচরণগত পরিবর্তনগুলি ঘোষণা করতে বাধ্য করে এবং বাস্তবে এটি সত্তা শ্রেণীর সাথে মন্তব্য করার সমান্তরাল সমাধান JsonSerialize। আপনি যদি এটিকে একইভাবে অনুভব করেন তবে আপনি আমার উত্তরটির প্রশংসা করতে পারেন এখানে: https://stackoverflow.com/a/43213463/653539


1

আমার জন্য একটি সহজ সমাধান ছিল কেবলমাত্র অন্য একটি বিন যোগ করা এবং এটি ObjectMapperঅবৈধভাবে ডিজিটালাইজ করতে ব্যবহার করা ( https://stackoverflow.com/users/1032167/varren মন্তব্যকে ধন্যবাদ ) - আমার ক্ষেত্রে আমি এটির আইডিতে ডিজিটালাইজেশন করতে আগ্রহী ছিলাম (একটি int) বা সম্পূর্ণ অবজেক্ট https://stackoverflow.com/a/46618193/986160

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.springframework.context.annotation.Bean;

import java.io.IOException;

public class IdWrapperDeserializer<T> extends StdDeserializer<T> {

    private Class<T> clazz;

    public IdWrapperDeserializer(Class<T> clazz) {
        super(clazz);
        this.clazz = clazz;
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        return mapper;
    }

    @Override
    public T deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        String json = jp.readValueAsTree().toString();
          // do your custom deserialization here using json
          // and decide when to use default deserialization using local objectMapper:
          T obj = objectMapper().readValue(json, clazz);

          return obj;
     }
}

কাস্টম ডিসরিয়ালাইজারের মধ্য দিয়ে যাওয়া প্রতিটি সত্তার জন্য আমাদের এটিকে ObjectMapperআমার ক্ষেত্রে স্প্রিং বুট অ্যাপ্লিকেশানের গ্লোবাল বিনগুলিতে কনফিগার করতে হবে (যেমন Category)

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
                mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
            mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
            mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    SimpleModule testModule = new SimpleModule("MyModule")
            .addDeserializer(Category.class, new IdWrapperDeserializer(Category.class))

    mapper.registerModule(testModule);

    return mapper;
}

0

আপনি যদি স্ক্র্যাচ থেকে আপনার কাস্টম ডিসরিয়ালাইজার তৈরি করার চেষ্টা করেন তবে আপনি ব্যর্থ হতে বাধ্য।

পরিবর্তে, আপনাকে একটি কাস্টমের মাধ্যমে (সম্পূর্ণরূপে কনফিগার করা) ডিফল্ট ডিসরিয়ালাইজার দৃষ্টান্তটি ধরে রাখতে হবে BeanDeserializerModifierএবং তারপরে এই কাস্টমটি আপনার কাস্টম ডিসরিযায়ার শ্রেণিতে পাঠাতে হবে:

public ObjectMapper getMapperWithCustomDeserializer() {
    ObjectMapper objectMapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.setDeserializerModifier(new BeanDeserializerModifier() {
        @Override
        public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
                    BeanDescription beanDesc, JsonDeserializer<?> defaultDeserializer) 
            if (beanDesc.getBeanClass() == User.class) {
                return new UserEventDeserializer(defaultDeserializer);
            } else {
                return defaultDeserializer;
            }
        }
    });
    objectMapper.registerModule(module);

    return objectMapper;
}

দ্রষ্টব্য: এই মডিউল রেজিস্ট্রেশন @JsonDeserializeটীকা প্রতিস্থাপন , Userক্লাস বাUser ক্ষেত্রগুলি আর এই টীকায় টিকা দেওয়া উচিত নয়।

কাস্টম ডিসরিয়ালাইজারটি এর উপর ভিত্তি করে এমন হওয়া উচিত DelegatingDeserializerযাতে সমস্ত পদ্ধতি প্রতিনিধিত্ব করে, যদি না আপনি একটি স্পষ্ট বাস্তবায়ন সরবরাহ করেন:

public class UserEventDeserializer extends DelegatingDeserializer {

    public UserEventDeserializer(JsonDeserializer<?> delegate) {
        super(delegate);
    }

    @Override
    protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegate) {
        return new UserEventDeserializer(newDelegate);
    }

    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {
        User result = (User) super.deserialize(p, ctxt);

        // add special logic here

        return result;
    }
}

0

ব্যবহার BeanDeserializerModifierভালভাবে কাজ করে তবে আপনার যদি প্রয়োজন হয় তবে JsonDeserializeএটির AnnotationIntrospector মতো করার একটি উপায় রয়েছে :

ObjectMapper originalMapper = new ObjectMapper();
ObjectMapper copy = originalMapper.copy();//to keep original configuration
copy.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {

            @Override
            public Object findDeserializer(Annotated a) {
                Object deserializer = super.findDeserializer(a);
                if (deserializer == null) {
                    return null;
                }
                if (deserializer.equals(MyDeserializer.class)) {
                    return null;
                }
                return deserializer;
            }
});

এখন অনুলিপি করা ম্যাপারগুলি এখন আপনার কাস্টম ডিসিরিয়ালাইজার (মাইডিসরিয়ালাইজার.ক্লাস) উপেক্ষা করবে এবং ডিফল্ট বাস্তবায়ন ব্যবহার করবে। deserializeঅনুলিপি এড়াতে আপনি আপনার কাস্টম ডিসরিয়ালাইজারের অভ্যন্তরীণ পদ্ধতির অভ্যন্তরে এটি ব্যবহার করতে পারেন অনুলিপি এড়াতে কপিরাইট ম্যাপার স্ট্যাটিক তৈরি করে বা স্প্রিং ব্যবহার করে যদি তারটি ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.