জসন.নেটের সাথে সিরিয়াল করার সময় আমি কীভাবে সম্পত্তির নাম পরিবর্তন করতে পারি?


434

আমার কাছে সি # ডেটাসেট অবজেক্টে কিছু ডেটা রয়েছে। আমি এখনই এটির মতো কোনও জসন নেট রূপান্তরকারী ব্যবহার করে এটি সিরিয়ালিয়াল করতে পারি

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

যাইহোক, dataএটি .json ফাইলে প্রিন্ট করার সময় থেকে সম্পত্তির নাম ব্যবহার করে । আমি সম্পত্তির নামগুলি কিছু আলাদা হতে চাই (বলুন, 'ফু' পরিবর্তন করুন 'বারে')।

ইন Json.net ডকুমেন্টেশন , 'Serializing এবং Deserializing তাদেরকে JSON' অধীনে → 'ধারাবাহিকতাতে আরোপ করা' তাদের মতে "JsonPropertyAttribute ... পারবেন নাম কাস্টমাইজড করা"। তবে এর উদাহরণ নেই। সম্পত্তির নামটি অন্য কোনও কিছুর জন্য কীভাবে জসনপ্রপার্টিঅ্যাট্রিবিউট ব্যবহার করবেন তা কি কেউ জানেন?

( ডকুমেন্টেশনের সরাসরি লিঙ্ক )

Json.net এর ডকুমেন্টেশনগুলি খুব কমই মনে হচ্ছে। আপনার যদি দুর্দান্ত উদাহরণ থাকে তবে আমি এটি অফিসিয়াল ডকুমেন্টেশনে যুক্ত করার চেষ্টা করব। ধন্যবাদ!


3
এফওয়াইআই, নমুনার অধীনে ডকুমেন্টেশনে এর একটি উদাহরণ রয়েছে -> জেএসএন সিরিয়ালাইজ -> জসনপ্রোপার্টিঅ্যাট্রিবিউট নাম । এটি কোন পর্যায়ে যুক্ত হয়েছিল তা নিশ্চিত নয়।
ব্রায়ান রজার্স

উত্তর:


791

আপনি যে [JsonProperty]বৈশিষ্ট্যটির দ্বারা এটির নাম নিয়ন্ত্রণ করতে চান সেই বৈশিষ্ট্যটি দিয়ে আপনি এটি সাজাতে পারেন যা আপনাকে আলাদা নাম নির্দিষ্ট করতে দেয়:

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

ডকুমেন্টেশন: সিরিয়ালাইজেশন বৈশিষ্ট্য


1
এর জন্য কি আমার কী প্রয়োজন যে আমি ডেটাসেটের পরিবর্তে তৈরি কাস্টম অবজেক্টে আমার ডেটা পড়ি?
কালিক

3
@ কুলিক্স, হ্যাঁ, এটির জন্য একটি মডেল ব্যবহার করা দরকার। একটি ডেটাসেট একটি দুর্বল টাইপযুক্ত কাঠামো, সুতরাং এর জন্য সম্পত্তি নামের কথা বলা খুব যৌক্তিক নয়।
দারিন দিমিত্রভ

76
শর্টহ্যান্ড হিসাবে, আপনি এটিও করতে পারেন[JsonProperty("FooBar")]
বার্ট ভার্কোইজেন

2
@ ডারিনডিমিট্রভ জসসন। নেট ছাড়া এটি করার কোনও উপায় আছে?
CH81

12
কোনও মডেল ব্যবহার করা সহজ তবে আপনার জেএসএনের একটি নমুনা নিন এবং এটি "খালি স্পেশাল" -> "ক্লাস হিসাবে জেএসএন আটকান" ব্যবহার করে একটি খালি .cs ফাইলগুলিতে আটকান। - এটি ভিজ্যুয়াল স্টুডিওতে অন্তর্নির্মিত। - সেখান থেকে, আপনার মূলত জিনিসগুলি শিরোনাম কেস / পুনরায় নামকরণ স্টাফগুলি ব্যবহারের জন্য সেট করতে হবে N নেট নামকরণ কনভেনশন ইত্যাদি the
BrainSlugs83

71

বৈশিষ্ট্যগুলি পরিবর্তন করতে যদি আপনার ক্লাসে অ্যাক্সেস না থাকে বা সর্বদা একই নাম পরিবর্তনের সম্পত্তিটি ব্যবহার করতে না চান তবে কাস্টম রিসলভার তৈরি করে পুনরায় নামকরণও করা যেতে পারে।

উদাহরণস্বরূপ, যদি আপনার কাছে একটি শ্রেণি কল করা থাকে MyCustomObject, যার একটি সম্পত্তি বলা হয় LongPropertyName, আপনি এটির মতো একটি কাস্টম রিসলভার ব্যবহার করতে পারেন ...

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

তারপরে সিরিয়ালকরণের জন্য কল করুন এবং সমাধানের সরবরাহ করুন:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

এবং ফলাফলটি Long "লংপ্রোপার্টিনেম": "প্রোপ মান"} এর পরিবর্তে {"সংক্ষিপ্ত": "প্রপ মান" to এ সংক্ষিপ্ত করা হবে

কাস্টম রিসলভারগুলি সম্পর্কে আরও তথ্য এখানে


1
এটি আরও ভাল সমাধান যদি আপনার ক্লাসিকে সিরিয়ালাইজ করার জন্য অন্য কোনও সমাবেশে ঘোষণা করা হয় যার মধ্যে নিউটনসফট.জসন প্যাকেজটির আলাদা সংস্করণ রয়েছে। (এটি কোনও ত্রুটি এমনকি ছুঁড়ে নাও দিতে পারে)। DefaultContractResolverএকই সমাবেশ যেখানে JsonConvert.Serialize () মেথড ব্যবহার করা হয় রাখা ইন করতে হবে।
কৃত্রিম

6

এখনও এটা করতে অন্য উপায়, যা একটি বিশেষ ব্যবহার করা হয় NamingStrategy , যা তাদের সাথে শোভাকর দ্বারা একটি বর্গ বা সম্পত্তি প্রয়োগ করা যেতে পারে [JSonObject]বা [JsonProperty]

নামকরণের পূর্বনির্ধারিত কৌশলগুলি রয়েছে CamelCaseNamingStrategyতবে আপনি নিজের পরিকল্পনা বাস্তবায়ন করতে পারেন।

নামকরণের বিভিন্ন কৌশল বাস্তবায়ন এখানে পাওয়া যাবে: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization


3
আপনি যদি সক্ষম হন তবে দয়া করে একটি কাস্টম নামকরণস্ট্রেজি বাস্তবায়নের উদাহরণ ভাগ করুন
ব্যবহারকারী 1007074

অবশ্যই না. এটি আপনার নিজের দ্বারা করা উচিত ছিল, তবে আমি আপনাকে বলার সময়টি ছাড়িয়ে দেব যে আপনাকে কেবল newtonsoft.com/json/help/html/… উত্তরাধিকারী হতে হবে আপনি বিদ্যমান বর্গগুলি বাস্তবায়ন করতে পারেন এবং নিজের একটি তৈরি করতে পারেন।
জোটাবি

ধন্যবাদ - আমার আমার মন্তব্যটি আপডেট করা উচিত ছিল: আসলে গিটহাবের গৌরবকে ধন্যবাদ, নিউটসনফ্টের নিজস্ব প্রয়োগগুলির একটি উদাহরণ হিসাবে ব্যবহার করতে পারেন, বলুন, এটি
ইউজার 1007074

8
@ জোটাবি, এটি স্ট্যাকওভারফ্লোয়ের আত্মা নয়। এবং একজন প্রোগ্রামার হিসাবে যিনি কেবল আমার কাজটি সেরে ফেলতে চান, সত্যই, আপনার দেওয়া কোডটি উত্তোলন করা আমার পক্ষে হাজার গুণ ভাল হত। এবং আপনি আমার ভোটও পেতেন। আমার 18 বছরের কোডিংয়ের অভিজ্ঞতা রয়েছে এবং আমি ট্রিপলবাইটকে সি # তে "বিশেষজ্ঞ" হিসাবে স্থান দিয়েছি। প্রত্যেকটি সমস্যা "পাঠকের অনুশীলন" হিসাবে ছেড়ে যাওয়ার দরকার নেই। কখনও কখনও আমরা কেবল আমাদের কাজটি করতে এবং এগিয়ে যেতে চাই।
bboyle1234

2
আমি আপনার সাথে একমত, এবং আমি সাধারণত এই ধরণের মন্তব্য লিখি না। তবে, আমি আশ্বস্ত করতে পারি যে, এই ক্ষেত্রে লিঙ্কযুক্ত কোডটি অনুসন্ধান করা আমি যে কোনও ব্যাখ্যা দিতে পারি না তার চেয়ে ভাল। এবং json.net একটি খুব ভাল নথিভুক্ত ওপেন সোর্স লাইব্রেরি। বাস্তবায়নের অন্তর্ভুক্ত লিঙ্ক (নিখুঁত উদাহরণ)
জোটাবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.