विशिष्ट ऑब्जेक्ट प्रकार की सूची में Newtonsoft.Json.Linq.JArray कन्वर्ट करें


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
सुनिश्चित करें कि आपकी कक्षा की परिभाषा में एक पैरामीटर रहित निर्माता शामिल है।
Faust

1
तो कैसे संभालना है अगर सरणी में एक अशक्त क्षेत्र है? इस बार मुझे त्रुटि JsonSerializationException मिलती है। मैं डेटा चाहता हूं और मैं चाहता हूं कि यह किसी भी अशक्त डेटा के लिए शून्य बना रहे।
एंसर तुर्कोग्लू

1
@nsarchar क्या आपने जाँच की है कि आपकी संपत्ति अशक्त है?
जननिक

@realPro मेरे लिए काम करता है। क्या आप सुनिश्चित हैं कि आपके पास एक सरणी है और उस JArray में जोबजेक्ट्स ठीक से मैप कर सकते हैं?
वीएसओ

आपको यह त्रुटि भी दिखाई देगी यदि आप गलती से गैर-जेनेरिक का उपयोग करते 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();

सर इस कोड को मेरी प्रतिक्रिया से पहला मूल्य मिल रहा है, लेकिन मेरे पास बहुत सारे मूल्य हैं जिन्हें मैं सभी मूल्य कैसे प्राप्त कर सकता हूं। लेकिन मुझे केवल एक मूल्य प्राप्त करने की आवश्यकता है, मेरा मतलब है कि प्रतिक्रिया में एक firstname और lastname है। मैं सिर्फ firstname प्राप्त करना चाहता हूं मैं कैसे कर सकता हूं वो करें ?
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;

या linq एक्सटेंशन का उपयोग करें

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) });

कृपया उपरोक्त समाधान पर ध्यान दें मैंने गतिशील वस्तु का उपयोग किया है

मैं कुछ और समाधानों के बारे में सोच सकता हूं जो उपरोक्त समाधानों के संयोजन हैं। लेकिन मुझे लगता है कि यह लगभग सभी उपलब्ध तरीकों को शामिल करता है।

अपने आप को मैं पहले एक का उपयोग करें


1
आपने किसी भी गतिशील वस्तुओं का उपयोग नहीं किया। आपने केवल दृढ़ता से टाइप की गई वस्तु का उपयोग किया है। कृपया, दोनों के बीच के अंतर के लिए CLR और DLR देखें।
user1789573

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;
  }
}

आप JsonProperty एनोटेशन का भी उपयोग कर सकते हैं और अपनी JSON ऑब्जेक्ट को किसी सूची में शामिल नहीं कर सकते हैं। 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

सूची में परिवर्तित करने के लिए JArray गणना और लूप का उपयोग करने के लिए IList का उपयोग करें

       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());             
            }                         
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.