নিউটোনসফট.জসন.লিনক.জেআর্রে নির্দিষ্ট অবজেক্টের ধরণের তালিকায় রূপান্তর করুন


236

আমি টাইপ নিম্নলিখিত পরিবর্তনশীল আছে {Newtonsoft.Json.Linq.JArray}

properties["Value"] {[
  {
    "Name": "Username",
    "Selected": true
  },
  {
    "Name": "Password",
    "Selected": true
  }

]}

আমি যা অর্জন করতে চাই তা হ'ল এটিকে রূপান্তর করা List<SelectableEnumItem>যেখানে SelectableEnumItemনিম্নলিখিত ধরণের:

public class SelectableEnumItem
    {
        public string Name { get; set; }
        public bool Selected { get; set; }
    }

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

উত্তর:


480

শুধু কল array.ToObject<List<SelectableEnumItem>>()পদ্ধতি। এটি আপনার যা প্রয়োজন তা ফিরিয়ে দেবে।

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


4
আপনার শ্রেণীর সংজ্ঞায় একটি পরামিতিবিহীন নির্মাণকারী অন্তর্ভুক্ত রয়েছে তা নিশ্চিত হন।
ফলস

1
সুতরাং অ্যারে একটি নাল ক্ষেত্র আছে কিভাবে পরিচালনা করবেন? এবার আমি ত্রুটি পেয়েছি JsonSerializationException E আমি ডেটা চাই এবং আমি এটি কোনও নাল ডেটার জন্য শূন্য থাকতে চাই।
আনসার টার্কোগলু

1
@nsarcar আপনি কি পরীক্ষা করে দেখেছেন যে আপনার সম্পত্তি হ্রাসযোগ্য?
জান্নিক

@ রিয়ালপ্রো শুধু আমার জন্য কাজ করেছেন worked আপনি কি নিশ্চিত যে আপনার কাছে একটি অ্যারে রয়েছে এবং সেই জারির জোবেক্টগুলি সঠিকভাবে মানচিত্র করতে পারে?
ভিএসও

আপনি যদি ত্রুটিযুক্তভাবে এর JsonConvert.DeserializeObject(value)পরিবর্তে অ-জেনেরিক ব্যবহার করেন তবে এই ত্রুটিটিটিও দেখতে পাবেনJsonConvert.DeserializeObject<T>(value)
চাদ হেডককক

42

প্রশ্নের উদাহরণটি একটি সহজ ক্ষেত্রে যেখানে সম্পত্তির নাম জেসন এবং কোডে হুবহু মিলে যায়। তাহলে অবস্থায় বৈশিষ্টগুলির নাম ঠিক মিলছে না, JSON মধ্যে যেমন সম্পত্তি "first_name": "Mark"এবং কোডে সম্পত্তি FirstNameতারপর ব্যবহার পদ্ধতি নির্বাচন করুন নিম্নরূপ

List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
{
    FirstName = (string)x["first_name"],
    Selected = (bool)x["selected"]
}).ToList();

স্যার এই কোডটি আমার প্রতিক্রিয়া থেকে প্রথম মান পাচ্ছে তবে আমার কাছে প্রচুর মান রয়েছে কীভাবে আমি সমস্ত মান পেতে পারি B তবে আমাকে কেবল একটি মান পেতে হবে যার অর্থ একটি প্রতিক্রিয়াতে একটি প্রথম নাম এবং পদবি রয়েছে I কর এটা ?
tpbafk

6

এখানে দেখানো হিসাবে আমার ক্ষেত্রে এপিআই রিটার্ন মান:

{
  "pageIndex": 1,
  "pageSize": 10,
  "totalCount": 1,
  "totalPageCount": 1,
  "items": [
    {
      "firstName": "Stephen",
      "otherNames": "Ebichondo",
      "phoneNumber": "+254721250736",
      "gender": 0,
      "clientStatus": 0,
      "dateOfBirth": "1979-08-16T00:00:00",
      "nationalID": "21734397",
      "emailAddress": "sebichondo@gmail.com",
      "id": 1,
      "addedDate": "2018-02-02T00:00:00",
      "modifiedDate": "2018-02-02T00:00:00"
    }
  ],
  "hasPreviousPage": false,
  "hasNextPage": false
}

ক্লায়েন্টের তালিকায় আইটেমি অ্যারের রূপান্তরটি এখানে প্রদর্শিত হিসাবে পরিচালনা করা হয়েছিল:

 if (responseMessage.IsSuccessStatusCode)
        {
            var responseData = responseMessage.Content.ReadAsStringAsync().Result;
            JObject result = JObject.Parse(responseData);

            var clientarray = result["items"].Value<JArray>();
            List<Client> clients = clientarray.ToObject<List<Client>>();
            return View(clients);
        }

ধন্যবাদ এই আমার জন্য কাজ C # এর গতিশীল বস্তু ব্যবহার
এন্থনি ম্যাকগ্রার

2

একই অর্জনের জন্য আমি বিভিন্ন পদ্ধতি সম্পর্কে ভাবতে পারি

IList<SelectableEnumItem> result= array;

বা (আমার কিছু পরিস্থিতি ছিল যে এটি ভালভাবে কাজ করে না)

var result = (List<SelectableEnumItem>) array;

বা লিনক এক্সটেনশন ব্যবহার করুন

var result = array.CastTo<List<SelectableEnumItem>>();

অথবা

var result= array.Select(x=> x).ToArray<SelectableEnumItem>();

বা আরও স্পষ্টভাবে

var result= array.Select(x=> new SelectableEnumItem{FirstName= x.Name, Selected = bool.Parse(x.selected) });

উপরের সমাধানটিতে মনোযোগ দিন দয়া করে আমি গতিশীল অবজেক্টটি ব্যবহার করেছি

আমি আরও কয়েকটি সমাধান সম্পর্কে ভাবতে পারি যা উপরের সমাধানগুলির সংমিশ্রণ। তবে আমি মনে করি এটি প্রায় সমস্ত উপলব্ধ পদ্ধতি কভার করে covers

নিজেই আমি প্রথমটি ব্যবহার করি


1
আপনি কোনও গতিশীল অবজেক্ট ব্যবহার করেন নি। আপনি কেবল দৃ strongly়-টাইপ করা অবজেক্টটি ব্যবহার করেছেন। দয়া করে দুজনের মধ্যে পার্থক্যের জন্য সিএলআর এবং ডিএলআর সন্ধান করুন।
ব্যবহারকারী 1789573

2
using Newtonsoft.Json.Linq;
using System.Linq;
using System.IO;
using System.Collections.Generic;

public List<string> GetJsonValues(string filePath, string propertyName)
{
  List<string> values = new List<string>();
  string read = string.Empty;
  using (StreamReader r = new StreamReader(filePath))
  {
    var json = r.ReadToEnd();
    var jObj = JObject.Parse(json);
    foreach (var j in jObj.Properties())
    {
      if (j.Name.Equals(propertyName))
      {
        var value = jObj[j.Name] as JArray;
        return values = value.ToObject<List<string>>();
      }
    }
    return values;
  }
}

আপনি জসনপ্রপার্টি টীকাটিও ব্যবহার করতে পারেন এবং আপনার জেএসওএন অবজেক্টকে একটি তালিকাতে ডিসায়ারাইজ করতে পারেন। public class SelectableEnumItem { [JsonProperty("Name")] public string Name { get; set; } [JsonProperty("Selected")] public bool Selected { get; set; } } public IList<SelectableEnumItem> GetListOfObject(string jsonTextHere) { return JsonConvert.DeserializeObject<List<SelectableEnumItem>>(jsonTextHere); }
মোহাম্মদ হোসেন

1

জ্যারে কাউন্ট পেতে আইলিস্ট ব্যবহার করুন এবং তালিকায় রূপান্তর করতে লুপ ব্যবহার করুন

       var array = result["items"].Value<JArray>();

        IList collection = (IList)array;

        var list = new List<string>();

        for (int i = 0; i < collection.Count; j++)
            {
              list.Add(collection[i].ToString());             
            }                         
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.