সিরিয়ালাইজেশনের সময় কেবলমাত্র @ জসনআইগনর ব্যবহার করুন, তবে ডিসিসায়ালাইজেশন নয়


325

আমার একটি ব্যবহারকারী অবজেক্ট রয়েছে যা সার্ভারে এবং পাঠানো হয়েছে। আমি যখন ব্যবহারকারী অবজেক্টটি প্রেরণ করি তখন আমি ক্লায়েন্টকে হ্যাশ পাসওয়ার্ডটি প্রেরণ করতে চাই না। সুতরাং, আমি @JsonIgnoreপাসওয়ার্ডের সম্পত্তিটিতে যুক্ত করেছি, তবে এটি পাসওয়ার্ডের ডিসিজায়ালাইজ হওয়া থেকে বাধা দেয় যা ব্যবহারকারীর পাসওয়ার্ড না পেয়ে সাইন আপ করা কঠিন করে তোলে।

আমি কীভাবে কেবল @JsonIgnoreসিরিয়ালাইজেশনে প্রয়োগ করতে পারি এবং ডিসরিয়ালাইজেশন না করে? আমি স্প্রিং জেএসনভিউ ব্যবহার করছি, তাই আমার উপর একটি টন নিয়ন্ত্রণ নেই ObjectMapper

যে জিনিসগুলি আমি চেষ্টা করেছি:

  1. যোগ @JsonIgnoreসম্পত্তিতে
  2. যোগ @JsonIgnoreসংগ্রহকারী পদ্ধতির উপর শুধুমাত্র

উত্তর:


481

ঠিক কীভাবে এটি করবেন তা জ্যাকসনের যে সংস্করণটি আপনি ব্যবহার করছেন তার উপর নির্ভর করে। এটি সংস্করণ 1.9 এর আশেপাশে পরিবর্তিত হয়েছে , এর আগে, আপনি @JsonIgnoreগিটারে যোগ করে এটি করতে পারেন ।

যা আপনি চেষ্টা করেছেন:

কেবলমাত্র জেটর পদ্ধতিতে @ জসনআইগনর যুক্ত করুন

এটা কর, এবং একটি নির্দিষ্ট যোগ @JsonPropertyআপনার বস্তুর উপর পাসওয়ার্ড সেটার পদ্ধতি আপনার তাদেরকে JSON "পাসওয়ার্ড" ক্ষেত্র নামের জন্য টীকা।

জ্যাকসন এর আরো সাম্প্রতিক সংস্করণে যোগ করা হয়েছে READ_ONLYএবং WRITE_ONLYএর জন্য টীকা আর্গুমেন্ট JsonProperty। সুতরাং আপনিও এর মতো কিছু করতে পারেন:

@JsonProperty(access = Access.WRITE_ONLY)
private String password;

দস্তাবেজগুলি এখানে পাওয়া যাবে


2
gist.github.com/thurloat/2510887 জ্যাকসন তাদেরকে JSON জন্য উপেক্ষা deserialize শুধুমাত্র
Hadas

1
আফাইক আপনাকে এখনও সেটারটি প্রয়োগ করতে হবে এবং এটিকে বেনিফিট করতে হবে। আমি কেবল সিরিয়ালাইজেশন পেতে চাই। ক্ষণিকের কথা আপনি কী বলছেন? এটি একটি জেপিএ টীকা আফাইক
ম্যাট ব্রোখুইস

3
এছাড়াও, ক্ষেত্র থেকে নিজেই @ জসনপ্রপার্টি অপসারণের বিষয়টি নিশ্চিত করুন নইলে এটি আপনার
গেটার

15
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
মিখাইল ব্যাটার

1
জ্যাকসন-এনোটেশনগুলি 2.5 এর পরবর্তী বৈশিষ্ট্যটি নেই। জ্যাকসন-এনোটেশনগুলি ২.
করেছে

98

এটি সম্পাদন করার জন্য, আমাদের যা দরকার তা হ'ল দুটি মন্তব্য:

  1. @JsonIgnore
  2. @JsonProperty

@JsonIgnoreক্লাসের সদস্য এবং তার প্রাপ্তকারী এবং তার সেটারে ব্যবহার করুন @JsonProperty। একটি নমুনার চিত্র এটি করতে সহায়তা করবে:

class User {

    // More fields here
    @JsonIgnore
    private String password;

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty
    public void setPassword(final String password) {
        this.password = password;
    }
}

2
এটি আমার কাছে জ্যাকসন ২.6.৪ নিয়ে কাজ করেছে। আমি @ জসনপ্রপার্টি (অ্যাক্সেস = অ্যাক্সেস.ডাব্লুআইআরআইটি.ইন.লাই) ব্যবহার করার জন্য যথাসাধ্য চেষ্টা করেছি তবে এটি আমার পক্ষে কার্যকর হয়নি।
সিরোভ্লাদিমির

77

সংস্করণ ২.6 থেকে: আরও স্বজ্ঞাত উপায় হ'ল com.fasterxml.jackson.annotation.JsonPropertyমাঠে টীকাটি ব্যবহার করা :

@JsonProperty(access = Access.WRITE_ONLY)
private String myField;

এমনকি যদি কোনও গেটর উপস্থিত থাকে তবে ক্ষেত্রের মানটি সিরিয়ালকরণ থেকে বাদ দেওয়া হয়।

জাভাডক বলেছেন:

/**
 * Access setting that means that the property may only be written (set)
 * for deserialization,
 * but will not be read (get) on serialization, that is, the value of the property
 * is not included in serialization.
 */
WRITE_ONLY

যদি আপনার অন্যদিকে এটির প্রয়োজন হয় তবে কেবল ব্যবহার করুন Access.READ_ONLY


1
আমি বুঝতে পারছি না কেন এখানে এতগুলি আপোভেট রয়েছে, এই সমস্যাটি সমাধান করার জন্য এটি দুর্দান্ত উপায়, একটি কবজির মতো কাজ করে। গেটর, সেটার এবং ফিল্ডটি টীকা দেওয়ার দরকার নেই। কেবল ক্ষেত্র। ধন্যবাদ।
ক্রোসপ

এটি সংস্করণ ২.6 থেকে পাওয়া যায়, দেখুন দ্রুতxml.github.io/jackson- মন্তব্যগুলি
ড্যানিয়েল বিয়ার

সম্ভবত 2.6+ ব্যবহারকারীর জন্য সেরা উত্তর।
ডেভিড ডসোট

আপনি org.codehaus.jackson.annotate আমদানি ব্যবহার করছেন না তা নিশ্চিত করুন । @ ড্যানিয়েল বিয়ার এর সমাধান জ্যাকসন ২.6.৩ এর জন্য কাজ করে। এটি এখনই গ্রহণযোগ্য উত্তর হওয়া উচিত যে জ্যাকসন আপডেট হয়েছে।
কেন্ট বুল

13

আমার ক্ষেত্রে, আমার কাছে জ্যাকসন স্বয়ংক্রিয়ভাবে (ডি) স্প্রিং এমভিসি নিয়ন্ত্রক থেকে ফিরে আসা জিনিসগুলি সিরিয়ালাইজ করছে (আমি স্প্রিং ৪.১..6 এর সাথে @ রিস্টকন্ট্রোলার ব্যবহার করছি)। এর com.fasterxml.jackson.annotation.JsonIgnoreপরিবর্তে আমাকে ব্যবহার করতে হয়েছিল org.codehaus.jackson.annotate.JsonIgnore, অন্যথায়, এটি কেবল কিছুই করেনি।


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

2
"user": {
        "firstName": "Musa",
        "lastName": "Aliyev",
        "email": "klaudi2012@gmail.com",
        "passwordIn": "98989898", (or encoded version in front if we not using https)
        "country": "Azeribaijan",
        "phone": "+994707702747"
    }

@CrossOrigin(methods=RequestMethod.POST)
@RequestMapping("/public/register")
public @ResponseBody MsgKit registerNewUsert(@RequestBody User u){

        root.registerUser(u);

    return new MsgKit("registered");
}  

@Service
@Transactional
public class RootBsn {

    @Autowired UserRepository userRepo;

    public void registerUser(User u) throws Exception{

        u.setPassword(u.getPasswordIn());
        //Generate some salt and  setPassword (encoded -  salt+password)
        User u=userRepo.save(u);

        System.out.println("Registration information saved");
    }

}

    @Entity        
@JsonIgnoreProperties({"recordDate","modificationDate","status","createdBy","modifiedBy","salt","password"})
                    public class User implements Serializable {
                        private static final long serialVersionUID = 1L;

                        @Id
                        @GeneratedValue(strategy=GenerationType.AUTO)
                        private Long id;

                        private String country;

                        @Column(name="CREATED_BY")
                        private String createdBy;

                        private String email;

                        @Column(name="FIRST_NAME")
                        private String firstName;

                        @Column(name="LAST_LOGIN_DATE")
                        private Timestamp lastLoginDate;

                        @Column(name="LAST_NAME")
                        private String lastName;

                        @Column(name="MODIFICATION_DATE")
                        private Timestamp modificationDate;

                        @Column(name="MODIFIED_BY")
                        private String modifiedBy;

                        private String password;

                        @Transient
                        private String passwordIn;

                        private String phone;

                        @Column(name="RECORD_DATE")
                        private Timestamp recordDate;

                        private String salt;

                        private String status;

                        @Column(name="USER_STATUS")
                        private String userStatus;

                        public User() {
                        }
                // getters and setters
                }

4
এটি কীভাবে কোডটি কাজ করে তার একটি সংক্ষিপ্ত বিবরণ দিতে ভবিষ্যতে সহায়তা করতে পারে।
কুইলিয়ামস

ঠিক আছে !! আপনি এখানে কি চেষ্টা করছেন? বেশি ভোট পাচ্ছেন? lol
বালাজী বোগগ্রাম রমনারায়ণ

0

এটিকে পরিচালনা করার আর একটি সহজ উপায় হ'ল allowSetters=trueটীকাতে যুক্তিটি ব্যবহার করা । এটি পাসওয়ার্ডটিকে আপনার ডিটিওতে ডিসিরিয়ালাইজ করার অনুমতি দেবে তবে এটি কোনও প্রতিক্রিয়া সংস্থায় এটির ক্রিয়াকলাপটি তৈরি করবে না যা ব্যবহার করে অবজেক্ট রয়েছে।

উদাহরণ:

@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
    String foo;
    String bar;
}

উভয় foo এবং barঅবজেক্টে জনবহুল, তবে কেবল foo একটি প্রতিক্রিয়া শৃঙ্খলে লেখা হয়।


ওয়ার্কিং কোড স্নিপেট সহ আপনার উত্তর সম্পাদনা করেছে।
dkb

এটি আমার ভুল ছিল, আমি বুঝতে পারিনি যে আপনি ইতিমধ্যে স্নিপেট সংশোধন করেছেন। আপনার পরিবর্তনগুলি দেখে, গ্রোভির আমার লেখার বছরগুলি আমাকে পেয়েছে এবং জাভাতে আমার অনুবাদ কিছুটা রুক্ষ ছিল। দুঃখিত!
ndান্ডলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.