c# - JSON.NET का उपयोग कर JSON डेटा को सी#में deserializing




deserialization (6)

मैं सी # और जेएसओएन डेटा के साथ काम करने के लिए अपेक्षाकृत नया हूं और मार्गदर्शन की तलाश में हूं। मैं सी # 3.0 का उपयोग कर रहा हूं, .NET3.5SP1, और JSON.NET 3.5r6 के साथ।

मेरे पास एक परिभाषित सी # वर्ग है जिसे मुझे JSON संरचना से पॉप्युलेट करने की आवश्यकता है। हालांकि, वेब सेवा से पुनर्प्राप्त एक प्रविष्टि के लिए प्रत्येक जेएसओएन संरचना में सी # कक्षा के भीतर परिभाषित सभी संभावित गुण शामिल नहीं हैं।

मैं ऐसा कर रहा हूं जो गलत, कठिन तरीका है और जॉब्जेक्ट से प्रत्येक मूल्य को एक-एक करके चुनना और स्ट्रिंग को वांछित वर्ग संपत्ति में बदलना।

JsonSerializer serializer = new JsonSerializer();
var o = (JObject)serializer.Deserialize(myjsondata);

MyAccount.EmployeeID = (string)o["employeeid"][0];

सी # कक्षा में JSON संरचना को deserialize और JSON स्रोत से संभावित लापता डेटा को संभालने का सबसे अच्छा तरीका क्या है?

मेरी कक्षा को इस प्रकार परिभाषित किया गया है:

  public class MyAccount
  {

    [JsonProperty(PropertyName = "username")]
    public string UserID { get; set; }

    [JsonProperty(PropertyName = "givenname")]
    public string GivenName { get; set; }

    [JsonProperty(PropertyName = "sn")]
    public string Surname { get; set; }

    [JsonProperty(PropertyName = "passwordexpired")]
    public DateTime PasswordExpire { get; set; }

    [JsonProperty(PropertyName = "primaryaffiliation")]
    public string PrimaryAffiliation { get; set; }

    [JsonProperty(PropertyName = "affiliation")]
    public string[] Affiliation { get; set; }

    [JsonProperty(PropertyName = "affiliationstatus")]
    public string AffiliationStatus { get; set; }

    [JsonProperty(PropertyName = "affiliationmodifytimestamp")]
    public DateTime AffiliationLastModified { get; set; }

    [JsonProperty(PropertyName = "employeeid")]
    public string EmployeeID { get; set; }

    [JsonProperty(PropertyName = "accountstatus")]
    public string AccountStatus { get; set; }

    [JsonProperty(PropertyName = "accountstatusexpiration")]
    public DateTime AccountStatusExpiration { get; set; }

    [JsonProperty(PropertyName = "accountstatusexpmaxdate")]
    public DateTime AccountStatusExpirationMaxDate { get; set; }

    [JsonProperty(PropertyName = "accountstatusmodifytimestamp")]
    public DateTime AccountStatusModified { get; set; }

    [JsonProperty(PropertyName = "accountstatusexpnotice")]
    public string AccountStatusExpNotice { get; set; }

    [JsonProperty(PropertyName = "accountstatusmodifiedby")]
    public Dictionary<DateTime, string> AccountStatusModifiedBy { get; set; }

    [JsonProperty(PropertyName = "entrycreatedate")]
    public DateTime EntryCreatedate { get; set; }

    [JsonProperty(PropertyName = "entrydeactivationdate")]
    public DateTime EntryDeactivationDate { get; set; }

  }

और जेएसओएन का विश्लेषण करने के लिए नमूना है:

{
    "givenname": [
        "Robert"
    ],
    "passwordexpired": "20091031041550Z",
    "accountstatus": [
        "active"
    ],
    "accountstatusexpiration": [
        "20100612000000Z"
    ],
    "accountstatusexpmaxdate": [
        "20110410000000Z"
    ],
    "accountstatusmodifiedby": {
        "20100214173242Z": "tdecker",
        "20100304003242Z": "jsmith",
        "20100324103242Z": "jsmith",
        "20100325000005Z": "rjones",
        "20100326210634Z": "jsmith",
        "20100326211130Z": "jsmith"
    },
    "accountstatusmodifytimestamp": [
        "20100312001213Z"
    ],
    "affiliation": [
        "Employee",
        "Contractor",
        "Staff"
    ],
    "affiliationmodifytimestamp": [
        "20100312001213Z"
    ],
    "affiliationstatus": [
        "detached"
    ],
    "entrycreatedate": [
        "20000922072747Z"
    ],
    "username": [
        "rjohnson"
    ],
    "primaryaffiliation": [
        "Staff"
    ],
    "employeeid": [
        "999777666"
    ],
    "sn": [
        "Johnson"
    ]
}

उत्तर https://.com/a/10718128/776476 से पुन: उत्पन्न हुआ

चीजों को आसान बनाने के लिए आप सी # dynamic प्रकार का उपयोग कर सकते हैं। यह तकनीक फिर से फैक्टरिंग को सरल बनाती है क्योंकि यह जादू-तारों पर भरोसा नहीं करती है।

Json

नीचे json स्ट्रिंग एक http एपीआई कॉल से एक साधारण प्रतिक्रिया है और यह दो गुणों को परिभाषित करती है: Id और Name

{"Id": 1, "Name": "biofractal"}

सी#

इस स्ट्रिंग को गतिशील प्रकार में deserialize करने के लिए JsonConvert.DeserializeObject<dynamic>() का उपयोग करें, फिर सामान्य रूप से इसकी गुणों को आसानी से एक्सेस करें।

var results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

नोट : न्यूटन सॉफ्ट एंटरप्राइज़ के लिए NuGet लिंक http://nuget.org/packages/newtonsoft.json । जोड़ने के लिए मत भूलना: using Newtonsoft.Json; उन वर्गों तक पहुंचने के लिए।


Bbant के उत्तर का निर्माण, यह एक दूरस्थ यूआरएल से JSON deserializing के लिए मेरा पूरा समाधान है।

using Newtonsoft.Json;
using System.Net.Http;

namespace Base
{
    public class ApiConsumer<T>
    {
        public T data;
        private string url;

        public CalendarApiConsumer(string url)
        {
            this.url = url;
            this.data = getItems();
        }

        private T getItems()
        {
            T result = default(T);
            HttpClient client = new HttpClient();

            // This allows for debugging possible JSON issues
            var settings = new JsonSerializerSettings
            {
                Error = (sender, args) =>
                {
                    if (System.Diagnostics.Debugger.IsAttached)
                    {
                        System.Diagnostics.Debugger.Break();
                    }
                }
            };

            using (HttpResponseMessage response = client.GetAsync(this.url).Result)
            {
                if (response.IsSuccessStatusCode)
                {
                    result = JsonConvert.DeserializeObject<T>(response.Content.ReadAsStringAsync().Result, settings);
                }
            }
            return result;
        }
    }
}

उपयोग इस तरह होगा:

ApiConsumer<FeedResult> feed = new ApiConsumer<FeedResult>("http://example.info/feeds/feeds.aspx?alt=json-in-script");

जहां FeedResult Xamasoft JSON क्लास जेनरेटर का उपयोग करके उत्पन्न कक्षा है

यहां उपयोग की जाने वाली सेटिंग्स का एक स्क्रीनशॉट है, जो अजीब संपत्ति नामों की इजाजत देता है, जिसके लिए वेब संस्करण खाता नहीं ले सकता था।


आप उपयोग कर सकते हैं:

JsonConvert.PopulateObject(json, obj);

यहां: json जेसन स्ट्रिंग है, obj लक्ष्य वस्तु है। देखें: example

नोट: PopulateObject() बाद obj के सूची डेटा को मिटा नहीं देगा, obj's सूची सदस्य में उसका मूल डेटा और जेसन स्ट्रिंग से डेटा होगा


क्या आपने जेनेरिक DeserializeObject विधि का उपयोग करने की कोशिश की है?

JsonConvert.DeserializeObject<MyAccount>(myjsondata);

जेएसओएन डेटा में किसी भी लापता फ़ील्ड को केवल शून्य छोड़ दिया जाना चाहिए।

अद्यतन करें:

यदि JSON स्ट्रिंग एक सरणी है, तो इसे आज़माएं:

var jarray = JsonConvert.DeserializeObject<List<MyAccount>>(myjsondata);

jarray तब एक List<MyAccount> होना चाहिए।

एक और अद्यतन:

आप जो अपवाद प्राप्त कर रहे हैं वह ऑब्जेक्ट्स की सरणी के अनुरूप नहीं है- मुझे लगता है कि धारावाहिक को आपके शब्दकोश-टाइप accountstatusmodifiedby गए accountstatusmodifiedby प्रॉपर्टी के साथ समस्याएं आ रही हैं।

Serialization से accountstatusmodifiedby संपत्ति को छोड़कर देखें और देखें कि क्या इससे मदद मिलती है। यदि ऐसा होता है, तो आपको उस संपत्ति को अलग-अलग प्रतिनिधित्व करने की आवश्यकता हो सकती है।

प्रलेखन: JSON.NET के साथ JSON को क्रमबद्ध और deserializing


मैंने पाया कि मैंने अपना ऑब्जेक्ट गलत तरीके से बनाया था। मैंने जेएसओएन से मेरी ऑब्जेक्ट क्लास उत्पन्न करने के लिए http://json2csharp.com/ का उपयोग किया। एक बार जब मैं सही ओजेक्ट था तो मैं बिना किसी मुद्दे के कास्ट करने में सक्षम था। Norbit, Noob गलती। सोचा कि अगर आप एक ही समस्या है तो मैं इसे जोड़ दूंगा।






deserialization