c# - জেএসএন ডিসিরিয়ালাইজেশন-জেএসওএন.নেট সহ বৈশিষ্ট্যগুলিতে ম্যাপের অ্যারে সূচকগুলি




arrays json (2)

আমি। নেট অবজেক্টের সংকলনে একটি 2-মাত্রিক অ্যারে ডিজিজায়াল করতে চাই। কারণটি হ'ল, আমার ব্যবহারকারীদের জন্য একটি ইনপুট ফাইলের সাথে কাজ করা অ্যারে সিনট্যাক্স আরও সহজ হবে। সুতরাং আমি কেবল অ্যারেগুলির সূচকগুলি আমার টার্গেটের ধরণের নির্দিষ্ট বৈশিষ্ট্যে ম্যাপ করতে চাই।

ইজি এর সাথে:

[
     ["John", "Smith", "23"],
     ["Paula", "Martin", "54]
]

আমি একজন ব্যক্তির দুটি উদাহরণ পেতে পারি:

public class Person {
    public string First {get;set;}
    public string Last {get;set;}
    public string Age {get;set;}
}

যেখানে অভ্যন্তরীণ অ্যারের মানচিত্রগুলির সূচকগুলি প্রথমটিতে সূচক হয়, Last 1 টি মানচিত্র এবং Age সূচক 2 মানচিত্র;

জিসন.এনইটি প্রসারিত করার কি কোনও উপায় আছে যাতে deserialization চলাকালীন আমি ম্যাপিংটি করতে পারি যাতে প্রয়োগের বিশদটি গোপন থাকে? আমি একটি কাস্টম JsonConverter সাথে প্রায় JsonConverter কিন্তু এটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি খুব বেশি তথ্য পাই না।

সম্পাদনা: বিশেষত, আমি নিশ্চিত না যে JsonConverter সঠিকভাবে ব্যবহার করার উপযুক্ত জিনিস CanConvert এবং কীভাবে CanConvert বাস্তবায়ন CanConvert এবং কীভাবে ReadJson পদ্ধতিতে পাস করা প্যারামিটারগুলি ব্যবহার করতে হবে তা বুঝতে আমার সমস্যা হচ্ছে ReadJson


আপনি একটি JsonConverter এটি করতে পারেন। এই উদ্দেশ্যে একটি সাধারণ রূপান্তরকারী হবে:

public class PersonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Person);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var array = JArray.Load(reader);
        var person = (existingValue as Person ?? new Person());
        person.First = (string)array.ElementAtOrDefault(0);
        person.Last = (string)array.ElementAtOrDefault(1);
        person.Age = (string)array.ElementAtOrDefault(2);
        return person;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var person = (Person)value;
        serializer.Serialize(writer, new[] { person.First, person.Last, person.Age });
    }
}

যদি নির্দিষ্ট বৈশিষ্ট্যগুলিতে অ-আদিম ধরণের প্রকার থাকে তবে আপনি প্রয়োজনীয় ধরণের JToken.ToObject<T>(JsonSerializer) করতে JToken.ToObject<T>(JsonSerializer) ব্যবহার করতে পারেন:

person.First = array.ElementAtOrDefault(0)?.ToObject<string>(serializer);

তারপরে আপনি এটি আপনার ক্লাসে প্রয়োগ করতে পারেন:

[JsonConverter(typeof(PersonConverter))]
public class Person
{
    public string First { get; set; }
    public string Last { get; set; }
    public string Age { get; set; }
}

বা সেটিংসে এটি ব্যবহার করুন:

var settings = new JsonSerializerSettings { Converters = new [] { new PersonConverter() } };
var list = JsonConvert.DeserializeObject<List<Person>>(json, settings);

    public override bool CanConvert(Type objectType)
    {
        if (objectType == typeof(List<Person>)) return true;

        return false;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<Person> persons = new List<Person>();

        JArray personsArray = (JArray)serializer.Deserialize(reader);

        foreach (var personArray in personsArray.Children<JArray>())
        {
            persons.Add(new Person() { 
                         First = personArray[0].Value<string>(),
                         Last = personArray[1].Value<string>(),
                         Age = personArray[2].Value<string>()
                        });
        }

        return persons;
    }




json.net