কেবলমাত্র ক্ষেত্রগুলি ব্যবহার করতে জ্যাকসনকে কীভাবে নির্দিষ্ট করবেন - বিশ্বব্যাপী


189

ডিফল্ট জ্যাকন আচরণটি জসনকে সিরিয়ালাইজ করার জন্য এবং ডিজিটালাইজ করার জন্য উভয় বৈশিষ্ট্য (গিটার এবং সেটটার) এবং ক্ষেত্রগুলি ব্যবহার করে বলে মনে হচ্ছে।

আমি ক্ষেত্রগুলিকে সিরিয়ালাইজেশন কনফিগারেশনের ক্যানোনিকাল উত্স হিসাবে ব্যবহার করতে চাই এবং জ্যাকসনকে মোটেও বৈশিষ্ট্যগুলি দেখতে চাই না।

আমি টীকা দিয়ে পৃথক শ্রেণির ভিত্তিতে এটি করতে পারি:

 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

তবে আমি এটি প্রতিটি একক শ্রেণিতে রাখতে চাই না ...

বিশ্বব্যাপী এটি কনফিগার করা সম্ভব? অবজেক্ট ম্যাপারে কিছু যুক্ত করতে চান?


1
টিম একটি ভাল উত্তর দিয়েছেন। আরেকটি সম্ভাবনা হ'ল যদি আপনার একটি সাধারণ বেস শ্রেণি থাকে তবে আপনি সেইটির সাথে শ্রেণীর টিকা দিতে পারেন; টীকাগুলি জ্যাকসনের উত্তরাধিকার সূত্রে প্রাপ্ত।
স্টেক্সম্যান

1
আমি মনে করি আমি এটি চেষ্টা করেছিলাম, তবে মনে হচ্ছে বেস
সাবজেক্টের

2
না, যদি না সাব-ক্লাস ক্লাস টীকাকে ওভাররাইড করে না, পিতা-মাতার টীকাগুলি দৃশ্যমান হয় যেন তারা উপ-শ্রেণীর সংজ্ঞার অংশ হয় (যদি না হয় তবে এটি একটি বাগ হবে)। এটি জেডিকে কীভাবে টীকাগুলির সাথে ডিল করে তা অগত্যা নয়, তবে জ্যাকসন টীকাগুলির জন্য সম্পূর্ণ উত্তরাধিকার প্রয়োগ করে (এমনকি পদ্ধতিতে টীকা দেওয়ার জন্যও)।
স্টেক্সম্যান

INFER_PROPERTY_MUTATORSপতাকা থেকে সাবধান থাকুন । যদি কোনও দৃশ্যমান গেটর বা ক্ষেত্র থাকে তবে এটি সেটারগুলির দৃশ্যমানিকে বাধ্য করে।
ওন্দ্রা Žižka

উত্তর:


157

আপনি এই জাতীয় স্বতন্ত্র অবজেক্টম্যাপারগুলি কনফিগার করতে পারেন:

ObjectMapper mapper  = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

আপনি যদি এটি বিশ্বব্যাপী সেট করতে চান তবে আমি সাধারণত একটি মোড়ক ক্লাসের মাধ্যমে একটি কনফিগার করা ম্যাপার অ্যাক্সেস করি।


3
ভাল, যদিও আমি মনে করি আপনাকে চেকারও সেট করতে হবে (এক্সএক্সএক্সএক্স () পদ্ধতিগুলি সাধারণত একটি নতুন অবজেক্ট তৈরি করে)। সুতরাং 'mapper.setVisibilityChecker (mapper.getVisibilityChecker ()। এর সাথে ...) এর মতো কিছু';
স্টেক্সম্যান

সেটভিজিবিলিটিচেকারকে স্ট্যাকসম্যান ভাল কল করেছেন, আমি প্রতিফলনের উত্তর সম্পাদনা করেছি।
কেভিন বোয়ারক্সক্স

42
withGetterVisibilityis*পদ্ধতিগুলি কভার করে না , তবে withIsGetterVisibilityতাদের জন্য রয়েছে।
কেরুব

13
setVisibilityCheckerঅবচয় করা হয়। setVisibilityপরিবর্তে ব্যবহার করুন।
0x7d7b

1
এটাই আমার দরকার ছিল! এই কনফিগারেশনটি আমাকে হাইবারনেট সত্তাগুলি সহজেই ডিটিওতে রূপান্তর করতে একটি মিক্সিন ব্যবহার করার অনুমতি দেয়। ডিফল্টরূপে অবজেক্টম্যাপার সবকিছুকে ক্রমিকায়িত করে এবং একটি মিশিনকে কোন বৈশিষ্ট্য উপেক্ষা করতে হবে তা বোঝাতে হবে (অর্থাত্ ছেদটির পরিবর্তে বিয়োগ)।
টেস্টিওয়েট

150

জ্যাকসন ২.০ এ এবং পরে আপনি কেবল ব্যবহার করতে পারেন:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;   

...

ObjectMapper mapper = new ObjectMapper();    
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

স্বয়ংক্রিয়তা বন্ধ করতে।


1
হাই বন্ধুরা, আমি জ্যাকসন ১.৯.০ জারটি ব্যবহার করছি। জেসন স্ট্রিংয়ের উদ্দেশ্যে বস্তুটি সিরিয়াল করার সময় আমি অতিরিক্ত জসন সম্পত্তি পাচ্ছি। আমার জেএসন স্ট্রিংটি পাওয়া দরকার, যাতে @ জসনপ্রোপার্টি সহ কেবলমাত্র উল্লিখিত চলক রয়েছে। আপনি কি আমাকে এই বিষয়ে সাহায্য করতে পারেন?
jrhamza

7
ওপি প্রশ্নে উল্লিখিত ক্লাস টিকা দিয়ে আপনি শুরু করতে পারেন: @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)এরপরে, আপনি যে সমস্ত সম্পত্তি অন্তর্ভুক্ত করতে চান তা আপনাকে @JsonProperty
নোট

ধন্যবাদ! এর আগে, আমি অনেক কোড উদাহরণ পেয়েছি যেখানে প্রপার্টিএ্যাকসেসরের পরিবর্তে জসনমথোডকে রেফারেন্স করা হয়েছিল। আপনি যদি জসনমেথোদ অনুসন্ধান করেন, তবে আপনি খুব কমই সম্পত্তি সম্পত্তি হিসাবে লিঙ্ক পাবেন ... উত্তরসূরী নিদর্শনগুলিতে প্রতিস্থাপন শ্রেণীর নামগুলি সন্ধান করার সর্বোত্তম উপায় কী? শক্ত এবং কদর্য হতে পারে, না?
ফিলবার্নস

38

বিশেষত boolean is*(): প্রাপ্তদের জন্য :

নীচে না কেন আমি অনেক সময় ব্যয় করেছি

  @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

না এই

  setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

আমার বুলিয়ান গেটর / সেটারের জন্য কাজ করেছে।

সমাধান সহজ:

  @JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...          
  setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);

আপডেট: বসন্ত-বুট অনুমোদিত কনফিগার এটি:

jackson:
  visibility.field: any
  visibility.getter: none
  visibility.setter: none
  visibility.is-getter: none

দেখুন কমন আবেদন বৈশিষ্ট্য # JACKSON


1
সিম ক্লাসে কীভাবে সহজ সমাধান প্রয়োগ করা উচিত তা কী আপনি ব্যাখ্যা করতে পারেন?
পাভেল নিডোবা

1
ধন্যবাদ. ইজগেটর আমার জন্য দিনটি বাঁচিয়েছিল।
গ্রিচ করুন

এটি প্রশ্নের উত্তর নয় বরং বিভ্রান্তিকর।
ওন্দ্র ŽiŽka

14

জ্যাকসনের জন্য 1.9.10 আমি ব্যবহার করি

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

অটো নিবেদনের দিকে মোড় নেওয়ার জন্য।


2
যে উপায়. ধন্যবাদ।
চুনিউটেকায়া

এটি করার এবং "অটো সনাক্তকরণগুলি" অক্ষম করার মধ্যে কোনও পার্থক্য রয়েছে কিনা তা অবাক করে।
xenoterracide

10

এটি সম্পর্কে: আমি এটি একটি মিশ্রণ দিয়ে ব্যবহার করেছি

নন-কমপ্লায়েন্ট অবজেক্ট

@Entity
@Getter
@NoArgsConstructor
public class Telemetry {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long pk;
    private String id;
    private String organizationId;
    private String baseType;
    private String name;
    private Double lat;
    private Double lon;
    private Instant updateTimestamp;
}

Mixin:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public static class TelemetryMixin {}

ব্যবহার:

    ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);

এমন কোনও কিছুই নেই যা বলে যে আপনি কোনও ক্লাসের পূর্বাভাস করতে এবং একই মিশ্রণটি প্রয়োগ করতে পারবেন না।

আপনি যদি মিক্সিনগুলির সাথে পরিচিত না হন তবে সেগুলি ধারণাগতভাবে সহজ: মিক্সিনের কাঠামোটি লক্ষ্য শ্রেণীর উপর দুর্দান্তভাবে চাপিয়ে দেওয়া হয় ( জ্যাকসন অনুসারে, জেভিএম সম্পর্কিত নয়)।


3

আপনার কনফিগারেশনের বিষয়ে চিন্তা না করে আপনি যদি বিশ্বব্যাপী এটি করার কোনও উপায় চান তবে আপনি ObjectMapperনিজের টীকাটি তৈরি করতে পারেন:

@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonAutoDetect(
        getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE,
        creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public @interface JsonExplicit {
}

এখন আপনাকে কেবল আপনার ক্লাসগুলি দিয়ে এনেটেট করতে হবে @JsonExplicitএবং আপনি যেতে ভাল!

@JsonAutoDetectআপনার প্রোগ্রামের সাথে কী কাজ করে তার মান নির্ধারণ করেছে তা নিশ্চিত করতে উপরের কলটি সম্পাদনা করার বিষয়টি নিশ্চিত করুন।

আমাকে সম্পর্কে জানতে সহায়তা করার জন্য https://stackoverflow.com/a/13408807 এ ক্রেডিট@JacksonAnnotationsInside


3

আপনি যদি স্প্রিং বুট ব্যবহার করেন তবে আপনি জ্যাকসনকে বিশ্বব্যাপী কনফিগার করতে পারেন নিম্নরূপ:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonObjectMapperConfiguration implements Jackson2ObjectMapperBuilderCustomizer {

    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY);
    }

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