জ্যাকসন ব্যবহার করে জেএসএন-তে কোনও ফিল্ডের নাম কীভাবে পরিবর্তন করা যায়


169

আমি জ্যাকসন ব্যবহার করছি আমার কোনও বস্তুকে জসন-এ রূপান্তর করতে। বস্তুর 2 টি ক্ষেত্র রয়েছে:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

যেহেতু আমি jQuery অটো সম্পূর্ণ বৈশিষ্ট্যটির সাথে এটি ব্যবহার করতে চাই তাই আমি চাইছি যে 'আইডি' json এ 'মান' এবং 'নাম' হিসাবে 'লেবেল' হিসাবে প্রদর্শিত হবে। জ্যাকসন ডকুমেন্টেশন এই স্পষ্ট নয় এবং আমি প্রতি টীকা চেষ্টা করেছি যে এমনকি দূরবর্তী অবস্থান থেকে দেখে মনে হচ্ছে এটা আমি কি প্রয়োজন আছে কিন্তু আমি না পেতে পারেন nameযেমন প্রদর্শিত labelএবং idযেমন প্রদর্শিত valueJSON হবে।

কেউ কীভাবে এটি করতে হয় বা এটি সম্ভব হলে কী জানেন?


যদি আপনি অন্য কোনও উদ্দেশ্য বা ব্যবসায়িক যুক্তির জন্য সত্তা ("শহর") সম্ভাব্যভাবে ব্যবহার করতে যাচ্ছিলেন তবে আমি এর জেএসওএন প্রতিনিধিত্বকে লেবেল এবং মান হিসাবে সংজ্ঞায়িত করতে এড়াতে চাই। OTOH যদি এটি কম্বোসের জন্য নিখুঁতভাবে রেফারেন্স ডেটা ব্যবহার করা হয় তবে আপনার সম্ভবত আরও বেশি কিছু রয়েছে - এই সমস্তটি কভার করার জন্য জেনেরিক সত্তা (জোড় বা বিকল্প) তৈরি করা বিবেচনা করার একটি সম্ভাব্য পন্থা।
থমাস ডাব্লু

উত্তর:


323

আপনি কি @ জসনপ্রপার্টি ব্যবহার করার চেষ্টা করেছেন?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}

5
হ্যাঁ, আমি চেষ্টা করেছিলাম, তবে আমি করছি @JsonProperty(value="label")এবং এটি কাজ করছে না, আপনার পরামর্শ অনুসারে এটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে! ধন্যবাদ ম্যান এই এখন কোড সহজতর করতে সাহায্য করবে।
আলী

আমারও তেমন প্রয়োজন আছে। আমি কেবল জ্যাকসনকে রেস্টস্টেইজি ব্যবহার করছি এবং এটি কার্যকর হয় না: - / আশ্চর্য!
নিক্স

জ্যাকসন সত্যই কনফিগার করা সরবরাহকারী এবং অন্য কিছু নয়
যাচাই করুন

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

আমি @JsonProperty ("অবজেক্ট") ভল জেসনঅবজেক্টটি অবজেক্টটি ব্যবহার করেছি: স্ট্রিং, ... কিন্তু ব্যর্থ হয়েছে
রাজু তোমার পেপ ২

45

org.codehaus.jackson.annotate.JsonPropertyজ্যাকসন 1.x এবং com.fasterxml.jackson.annotation.JsonPropertyজ্যাকসন 2.x এ আছে তা জেনে রাখুন আপনি কোন অবজেক্টম্যাপারটি ব্যবহার করছেন (কোন সংস্করণ থেকে) তা পরীক্ষা করে দেখুন এবং নিশ্চিত করুন যে আপনি সঠিক টীকাটি ব্যবহার করছেন।


একটি org.json4s.jacksonনেমস্পেসও রয়েছে। :) এবং সম্ভবত jacksonYMMV এর অন্যান্য বাস্তবায়ন ।
জেসি

14

ক্ষেত্রটির নামকরণের জন্য আরও একটি বিকল্প রয়েছে:

জ্যাকসন MixIns

আপনি যদি তৃতীয় পক্ষের ক্লাসগুলির সাথে ডিল করেন, তবে আপনি যা বারণ করতে সক্ষম নন বা আপনি জ্যাকসনের নির্দিষ্ট টীকা দিয়ে ক্লাসকে কলুষিত করতে চান না তা কার্যকর।

মিক্সিন্সের জন্য জ্যাকসন ডকুমেন্টেশন পুরানো, সুতরাং এই উদাহরণটি আরও স্পষ্টতা সরবরাহ করতে পারে। সংক্ষেপে: আপনি মিক্সিন ক্লাস তৈরি করেন যা আপনার ইচ্ছেমতো সিরিয়ালাইজেশন করে। তারপরে এটি অবজেক্টম্যাপারে নিবন্ধ করুন:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

আমি কৌতূহল করছি ক্ষেত্রগুলি সিরিয়ালাইজেশন / ডিসরিয়ালাইজ করার সময় এটি কী কার্য সম্পাদনকে প্রভাবিত করবে?
চ্যানেলেন

2

জ্যাকসন

আপনি যদি জ্যাকসন ব্যবহার করে থাকেন তবে আপনি @JsonPropertyপ্রদত্ত জেএসওএন সম্পত্তির নাম কাস্টমাইজ করতে টিকাটি ব্যবহার করতে পারেন ।

অতএব, আপনাকে কেবল টীকা সহ সত্তা ক্ষেত্রগুলি টীকায়িত করতে হবে @JsonPropertyএবং একটি কাস্টম জেএসওএন সম্পত্তি নাম প্রদান করতে হবে:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

জাভাএই বা জাকার্তা জেএসএন-বি

জেএসএন-বি হ'ল জেএসএন-তে এবং জাভা অবজেক্টগুলিকে রূপান্তর করার জন্য আদর্শ বাঁধাই স্তর। আপনি যদি JSON-B ব্যবহার করছেন, তবে আপনি @JsonbPropertyটীকা দ্বারা JSON সম্পত্তি নামটি ওভাররাইড করতে পারেন :

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

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