.NET অবজেক্টে কোনও JObject ডিসরিয়ালাইজ করবেন কীভাবে


241

আমি আনন্দের সাথে নিউটনসফট জেএসএন লাইব্রেরিটি ব্যবহার করি । উদাহরণস্বরূপ, আমি JObjectএকটি .NET অবজেক্ট থেকে একটি তৈরি করব, এক্ষেত্রে ব্যতিক্রমের উদাহরণ (সম্ভবত সাবক্লাস হতে পারে বা নাও হতে পারে)

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);

এখন আমি জানি লাইব্রেরিটি কোনও বস্তুর JSON পাঠ্য (অর্থাত্ একটি স্ট্রিং) ডিসস্রায়াল করতে পারে

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

তবে আমি যা খুঁজছি তা হ'ল:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????

ভাল এটি পরিষ্কার যে আমি JObjectJSON পাঠ্যে ফিরে যেতে পারি এবং এর পরে deserialize কার্যকারিতাটি ব্যবহার করতে পারি তবে এটি আমার কাছে পিছনে বলে মনে হয়।

উত্তর:


489

এই পোস্ট অনুসারে , এটি এখন আরও ভাল:

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

ডকুমেন্টেশন: JSON কে এক ধরণের রূপান্তর করুন


10
এখানে কর্মক্ষমতা সম্পর্কে কোনও ধারণা? প্রতিবার প্রতিবিম্ব ব্যবহার করা হবে?
শান রোয়ান

1
এটি কি কাস্টম জসনকনভার্টারের সাহায্যে করা সম্ভব?
জাস্টিন স্কিলস

3
ইঙ্গিত দেওয়ার জন্য আপনাকে ধন্যবাদ। এটা আমাকে অনেক সাহায্য করেছে। আমাকে কিছু যুক্ত করতে দাও: জেনেরিক পদ্ধতিতে যেখানে আমি টাইপটি ব্যবহার করছি T, আমার result=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T);এটির সাফল্যের সাথে রূপান্তর করার মতো কিছু দরকার ছিল (নোট - valueএকটি ডাটাবেস থেকে আগত এমন একটি বস্তু যা জওবজেক্ট বা অন্য কোনও ক্ষেত্রে ফলাফলটি বাতিল হওয়া উচিত)।
ম্যাট

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

এবং jobject.ToObject(myObject.GetType())যদি আপনি অবজেক্টের ধরণটি না জানেন তবে ব্যবহার করুন ।
তোহিদ ২

45

ডকুমেন্টেশন থেকে আমি এটি খুঁজে পেয়েছি

JObject o = new JObject(
   new JProperty("Name", "John Smith"),
   new JProperty("BirthDate", new DateTime(1983, 3, 20))
);

JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));

Console.WriteLine(p.Name);

শ্রেণীর সংজ্ঞাটি Personনিম্নলিখিতগুলির সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত:

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}

সম্পাদন করা

আপনি যদি JSON.net এর সাম্প্রতিক সংস্করণ ব্যবহার করছেন এবং কাস্টম সিরিয়ালাইজেশন প্রয়োজন না থাকলে দয়া করে উপরে টিয়েনডোর উত্তর দেখুন (বা নীচে আপনি আমাকে তুলে ধরলে: পি) আরও সংক্ষিপ্ত is


2
কাস্টম সিরিয়ালাইজেশন সেটিংস পাস করতে সক্ষম হওয়ার জন্য আমার শর্টহ্যান্ডের চেয়ে এই পদ্ধতিটি ব্যবহার করা দরকার।
জাস্টিন ক্যালডিকট

সঠিক উত্তরগুলি আমি অনুসন্ধান করছি
মার্ক-VII

2

খুব দেরীতে, কেবল কেউ যদি অন্য কোনও উপায় সন্ধান করছে:

void Main()
{
    string jsonString = @"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}";

    Product product = new Product();
    //Serializing to Object
    Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();

    Console.WriteLine(obj);
}


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

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