c# - إلغاء تسلسل JSON Object Array مع Json.net




(2)

أحاول استخدام واجهة برمجة التطبيقات (API) التي تستخدم بنية المثال التالي ل json الذي تم إرجاعه

[
   {
      "customer":{
         "first_name":"Test",
         "last_name":"Account",
         "email":"[email protected]",
         "organization":"",
         "reference":null,
         "id":3545134,
         "created_at":"2013-08-06T15:51:15-04:00",
         "updated_at":"2013-08-06T15:51:15-04:00",
         "address":"",
         "address_2":"",
         "city":"",
         "state":"",
         "zip":"",
         "country":"",
         "phone":""
      }
   },
   {
      "customer":{
         "first_name":"Test",
         "last_name":"Account2",
         "email":"[email protected]",
         "organization":"",
         "reference":null,
         "id":3570462,
         "created_at":"2013-08-12T11:54:58-04:00",
         "updated_at":"2013-08-12T11:54:58-04:00",
         "address":"",
         "address_2":"",
         "city":"",
         "state":"",
         "zip":"",
         "country":"",
         "phone":""
      }
   }
]

سيعمل JSON.net بشكل رائع مع شيء مثل البنية التالية

{
    "customer": {
        ["field1" : "value", etc...],
        ["field1" : "value", etc...],
    }
}

ولكن لا أستطيع معرفة كيفية الحصول عليها لتكون سعيدة مع الهيكل المقدم.

يؤدي استخدام JsonConvert.DeserializeObject (المحتوى) الافتراضي إلى العدد الصحيح للعميل ولكن كل البيانات خالية.

يؤدي تنفيذ شيء ما في قائمة CustomerList (أدناه) إلى استثناء "لا يمكن إلغاء تسلسل مصفوفة JSON الحالي"

public class CustomerList
{
    public List<Customer> customer { get; set; }
}

أفكار؟


باستخدام الإجابة المقبولة لديك للوصول إلى كل سجل باستخدام Customers[i].customer ، وتحتاج إلى فئة CustomerJson إضافية ، وهو أمر مزعج بعض الشيء. إذا كنت لا ترغب في القيام بذلك ، فيمكنك استخدام ما يلي:

public class CustomerList
{
    [JsonConverter(typeof(MyListConverter))]
    public List<Customer> customer { get; set; }
}

لاحظ أنني أستخدم List<> ، وليس مصفوفة. الآن قم بإنشاء الفصل التالي:

class MyListConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        System.Diagnostics.Trace.Assert(objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>)), "CrazyList has to be a List<>");
        var token = JToken.Load(reader);
        var list = Activator.CreateInstance(objectType) as System.Collections.IList;
        var itemType = objectType.GenericTypeArguments[0];
        foreach (var child in token.Values())
        {
            var childToken = child.Children().First();
            var newObject = Activator.CreateInstance(itemType);
            serializer.Populate(childToken.CreateReader(), newObject);
            list.Add(newObject);
        }
        return list;
    }

    public override bool CanConvert(Type objectType) => true;
    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}

بالنسبة لأولئك الذين لا يريدون إنشاء أي طرازات ، استخدم الرمز التالي:

var result = JsonConvert.DeserializeObject<
  List<Dictionary<string, 
    Dictionary<string, string>>>>(content);






json.net