জসন.নেটের সাহায্যে জেএসএন অবজেক্ট অ্যারের ডিজায়ালাইজ করা


118

আমি এমন একটি এপিআই ব্যবহার করার চেষ্টা করছি যা তাদের ফিরে আসা জসন এর জন্য অনুসরণের উদাহরণটি ব্যবহার করে

[
   {
      "customer":{
         "first_name":"Test",
         "last_name":"Account",
         "email":"test1@example.com",
         "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":"test2@example.com",
         "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...],
    }
}

তবে সরবরাহিত কাঠামোর সাথে এটি কীভাবে খুশি হতে পারে তা আমি বুঝতে পারি না।

ডিফল্ট জসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট (সামগ্রী) ব্যবহারের ফলে গ্রাহকের সঠিক সংখ্যা পাওয়া যায় তবে সমস্ত ডেটা শূন্য থাকে।

গ্রাহকলিস্ট (নীচে) কিছু করার ফলে "বর্তমান জেএসএন অ্যারের বিশ্লেষণ করা যায় না"

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

থটস?


এটা কি তোমার প্রশ্নের উত্তর? সি # এর সাথে
জেএসনকে ডিজিজায়াল করুন

উত্তর:


187

আপনি আপনার জসনকে ডিসিরিয়ালাইজ করতে একটি নতুন মডেল তৈরি করতে পারেন CustomerJson:

public class CustomerJson
{
    [JsonProperty("customer")]
    public Customer Customer { get; set; }
}

public class Customer
{
    [JsonProperty("first_name")]
    public string Firstname { get; set; }

    [JsonProperty("last_name")]
    public string Lastname { get; set; }

    ...
}

এবং আপনি সহজেই আপনার জসনকে deserialize করতে পারেন:

JsonConvert.DeserializeObject<List<CustomerJson>>(json);

আশা করি এটা সাহায্য করবে !

ডকুমেন্টেশন: জেএসএনকে সিরিয়ালাইজিং এবং ডিজিজারাইজ করছে


1
ধন্যবাদ। বিষয়টি ভাবতে ভাবতে শেষ হয়ে গেল। আপনি প্রথম উত্তর হিসাবে আপনার উত্তর গৃহীত হয়েছিল।
শন সি

2
JsonConvert.DeserializeObject <তালিকা <CustomerJson >> (JSON); স্ট্রিং ইনপুট জন্য নিখুঁত কাজ করে।
মার্কেল মায়ারস

DeserializeObject()এআরএম চালানো অ্যান্ড্রয়েড ফোনগুলিতে ধীর গতির। এই মামলার আর কোন ভাল সমাধান?
তাদেজ

1
জোব্রেক্টের সাথে নেভিগেট করার চেষ্টা করুনJObject.Parse(json);
জোফ্রে কার্ন

47

যারা কোনও মডেল তৈরি করতে চান না তাদের জন্য নিম্নলিখিত কোডটি ব্যবহার করুন:

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

দ্রষ্টব্য: এটি আপনার JSON স্ট্রিংয়ের জন্য কাজ করে না । এটি কোনও জেএসএন কাঠামোর সাধারণ সমাধান নয়


10
এটি একটি ভয়ানক সমাধান। পরিবর্তে, আপনি যদি মডেল তৈরি করতে না চান, ব্যবহার করুনvar result = JsonConvert.DeserializeObject<Tuple<string, string, string>>(content);
a11smiles

1
@ a11smiles দয়া করে ব্যাখ্যা করুন কেন এটি একটি ভয়াবহ সমাধান।
টাইলার দীর্ঘ

2
প্রথমত, বিভিন্ন ধরণের IEnumerableবাস্তবায়নের জন্য অপ্রয়োজনীয় মেমরির বরাদ্দ (একটি তালিকার <তালিকার তুলনায় 3)। দ্বিতীয়ত, আপনার সমাধানটি দুটি স্বতন্ত্র কী বোঝায় - প্রতিটি অভিধানের জন্য 1। একাধিক গ্রাহকের একই নাম থাকলে কী হবে? কীগুলির মধ্যে কোনও পার্থক্য থাকবে না। আপনার সমাধান এই বিরোধকে বিবেচনায় নেয় না।
a11smiles

2
@ a11 স্মৃতিগুলি প্রতিটি গ্রাহক একটি পৃথক অভিধান। সুতরাং কোনও সমস্যা হবে না এমনকি একই নাম থাকা একাধিক গ্রাহকও রয়েছেন।
টাইলার লং

1
@ এ 11 স্মাইলগুলি আমি ভাবছি কেন আপনি ভাবেন var result = JsonConvert.DeserializeObject<Tuple<string, string, string>>(content);যে কাজ করবে। দৃশ্যত এটি কাজ করে না
টাইলার লং

1

স্বীকৃত উত্তরটি ব্যবহার করে আপনাকে প্রতিটি রেকর্ডটি ব্যবহার করে অ্যাক্সেস 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)
    {
        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)
    {
        return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>));
    }
    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}

1

উপরে বর্ণিত যা থেকে সামান্য পরিবর্তন। আমার জসন ফর্ম্যাটটি যা বৈধতা দেয়

{
    mycollection:{[
           {   
               property0:value,
               property1:value,
             },
             {   
               property0:value,
               property1:value,
             }
           ]

         }
       }

অ্যালেক্সডেভের প্রতিক্রিয়া ব্যবহার করে, আমি প্রতিটি শিশুকে লুপিং করেছিলাম, এটি থেকে পাঠক তৈরি করে

 public partial class myModel
{
    public static List<myModel> FromJson(string json) => JsonConvert.DeserializeObject<myModelList>(json, Converter.Settings).model;
}

 public class myModelList {
    [JsonConverter(typeof(myModelConverter))]
    public List<myModel> model { get; set; }

}

class myModelConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        var list = Activator.CreateInstance(objectType) as System.Collections.IList;
        var itemType = objectType.GenericTypeArguments[0];
        foreach (var child in token.Children())  //mod here
        {
            var newObject = Activator.CreateInstance(itemType);
            serializer.Populate(child.CreateReader(), newObject); //mod here
            list.Add(newObject);
        }
        return list;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>));
    }
    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();

}

0

জেসি_ভিএ থেকে আরও পরিবর্তন, তার যা আছে তা নিয়ে যান এবং মাইমডেল কনভার্টারটি এর সাথে প্রতিস্থাপন করুন ...

public class MyModelConverter : JsonConverter
{
    //objectType is the type as specified for List<myModel> (i.e. myModel)
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader); //json from myModelList > model
        var list = Activator.CreateInstance(objectType) as System.Collections.IList; // new list to return
        var itemType = objectType.GenericTypeArguments[0]; // type of the list (myModel)
        if (token.Type.ToString() == "Object") //Object
        {
            var child = token.Children();
            var newObject = Activator.CreateInstance(itemType);
            serializer.Populate(token.CreateReader(), newObject);
            list.Add(newObject);
        }
        else //Array
        {
            foreach (var child in token.Children())
            {
                var newObject = Activator.CreateInstance(itemType);
                serializer.Populate(child.CreateReader(), newObject);
                list.Add(newObject);
            }
        }
        return list;

    }

    public override bool CanConvert(Type objectType)
    {
        return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>));
    }
    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}

এটি হয় যে json জন্য কাজ করা উচিত

myModelList{
 model: [{ ... object ... }]
}

অথবা

myModelList{
 model: { ... object ... }
}

তারা উভয়ই পার্স হয়ে যায় যেন তারা ছিল

myModelList{
 model: [{ ... object ... }]
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.