إلغاء تسلسل بيانات JSON إلى C#باستخدام JSON.NET




deserialization (6)

الإجابة مستنسخة من https://stackoverflow.com/a/10718128/776476

يمكنك استخدام النوع dynamic C # لتسهيل الأمور. هذه التقنية أيضًا تجعل إعادة التعميم أبسط لأنها لا تعتمد على الأوتار السحرية.

سلمان

سلسلة json أدناه هي استجابة بسيطة من استدعاء واجهة برمجة التطبيقات (API) ، وهي تحدد خاصيتين: Name .

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

C #

استخدم JsonConvert.DeserializeObject<dynamic>() تسلسل هذه السلسلة إلى نوع ديناميكي ثم ببساطة الوصول إلى خصائصها بالطريقة المعتادة.

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

ملاحظة : رابط NuGet الخاص بمجموعة NewtonSoft هو http://nuget.org/packages/newtonsoft.json . لا تنس أن تضيف: using Newtonsoft.Json; للوصول إلى تلك الطبقات.

أنا جديد نسبيًا في العمل مع بيانات C # و JSON وسأطلب التوجيه. أنا أستخدم C # 3.0 ، مع .NET3.5SP1 ، و JSON.NET 3.5r6.

لدي فئة C # محددة أحتاج إلى نشرها من بنية JSON. ومع ذلك ، لا تحتوي كل بنية JSON لإدخال يتم استرداده من خدمة ويب على كافة السمات الممكنة التي تم تعريفها داخل فئة C #.

لقد كنت أفعل ما يبدو أنه طريقة خاطئة ، صلبة وقطف كل قيمة واحدة تلو الأخرى من JObject وتحويل السلسلة إلى خاصية الفئة المرغوبة.

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

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

ما هي أفضل طريقة لإلغاء تسلسل بنية JSON إلى فئة C # ومعالجة البيانات المفقودة المحتملة من مصدر 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; }

  }

وعينة من JSON إلى تحليل هي:

{
    "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"
    ]
}

إذا افترضنا أن بيانات نموذجك صحيحة ، فإن givenname الخاص بك ، والإدخالات الأخرى الملتفة بين قوسين هي صفائف في JS ... سترغب في استخدام القائمة لأنواع البيانات تلك. وقائمة ليقول accountstatusexpmaxdate ... أعتقد أن المثال الخاص بك يحتوي على التواريخ المنسقة بشكل غير صحيح على الرغم من ذلك ، غير مؤكد حتى ما هو غير صحيح في المثال الخاص بك.

هذه رسالة قديمة ، ولكنها أرادت أن تلاحظ المشكلات.


بناء على إجابة bbant ، هذا هو الحل الكامل لإزالة JSON من عنوان URL بعيد.

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 هو الفئة التي تم إنشاؤها باستخدام Xsasoft JSON Class Generator

في ما يلي لقطة شاشة للإعدادات التي استخدمتها ، مما يسمح بأسماء مواقع غريبة لا يمكن حساب إصدار الويب لها.


لقد وجدت أنني بنيت جسدي بشكل غير صحيح. لقد استخدمت http://json2csharp.com/ لتوليد لي فئة الكائن من JSON. مرة واحدة كان لي Oject الصحيح تمكنت من المدلى بها دون قضية. النوبة ، خطأ Noob. فكرت في إضافته في حال كان لديك نفس المشكلة.


يمكنك استخدام:

JsonConvert.PopulateObject(json, obj);

هنا: json هو سلسلة json ، obj هو الكائن الهدف. انظر: example

ملاحظة: لن PopulateObject() بيانات قائمة obj ، بعد Populate() ، سوف يحتوي عضو قائمة obj's على بياناته وبياناته الأصلية من سلسلة json


يمكنك تجربة التحقق من بعض مولدات الصف عبر الإنترنت للحصول على مزيد من المعلومات. ومع ذلك ، أعتقد أن بعض الإجابات كانت مفيدة. هنا مقاربتي التي قد تكون مفيدة.

تم إجراء التعليمة البرمجية التالية مع وضع طريقة ديناميكية في الاعتبار.

dynObj = (JArray)JsonConvert.DeserializeObject(nvm);

        foreach (JObject item in dynObj)
        {
            foreach (JObject trend in item["trends"])
            {
         Console.WriteLine("{0}-{1}-{2}", trend["query"], trend["name"], trend["url"]);

            }
        }

يسمح لك هذا الكود بشكل أساسي بالوصول إلى الأعضاء المتواجدين في سلسلة Json. مجرد طريقة مختلفة دون الحاجة للطبقات. query trend url هي الأشياء الموجودة في سلسلة Json.

يمكنك أيضا استخدام هذا الموقع . لا تثق في الصفوف بنسبة 100٪ ولكنك تحصل على الفكرة.







deserialization