c# - সি#ডায়নামিক বস্তুর মধ্যে JSON Deserialize?




.net serialization (16)

কিভাবে গতিশীল এবং জাভাস্ক্রিপ্ট Serializer সঙ্গে সহজ জson পার্স

System.Web.Extensions এর রেফারেন্স যোগ করুন এবং System.Web.Script.Serialization using System.Web.Script.Serialization; এই নামস্থান যোগ করুন using System.Web.Script.Serialization; উপরে

public static void EasyJson()
{
    var jsonText = @"{
        ""some_number"": 108.541, 
        ""date_time"": ""2011-04-13T15:34:09Z"", 
        ""serial_number"": ""SN1234""
    }";

    var jss = new JavaScriptSerializer();
    var dict = jss.Deserialize<dynamic>(jsonText);

    Console.WriteLine(dict["some_number"]); 
    Console.ReadLine();
}

কিভাবে ন্যস্ত এবং জটিল Json গতিশীল এবং জাভাস্ক্রিপ্ট Serializer সঙ্গে পার্স

System.Web.Extensions এর রেফারেন্স যোগ করুন এবং System.Web.Script.Serialization using System.Web.Script.Serialization; এই নামস্থান যোগ করুন using System.Web.Script.Serialization; উপরে

public static void ComplexJson()
{
    var jsonText = @"{
        ""some_number"": 108.541, 
        ""date_time"": ""2011-04-13T15:34:09Z"", 
        ""serial_number"": ""SN1234"",
        ""more_data"": {
            ""field1"": 1.0,
            ""field2"": ""hello""
        }
    }";

    var jss = new JavaScriptSerializer();
    var dict = jss.Deserialize<dynamic>(jsonText);

    Console.WriteLine(dict["some_number"]); 
    Console.WriteLine(dict["more_data"]["field2"]);
    Console.ReadLine();
}

একটি C # 4 গতিশীল টাইপ মধ্যে JSON কন্টেন্ট deserialize করার একটি উপায় আছে? DataContractJsonSerializer ব্যবহার করার জন্য ক্লাসগুলির একটি গুচ্ছ তৈরি করা বাদ দেওয়া ভাল হবে।


.NET 4.0 এর জন্য একটি বিল্ট-ইন লাইব্রেরি রয়েছে:

using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
var d=jss.Deserialize<dynamic>(str);

এই সহজ উপায়।


JSON.NET এ Deserializing JObject ক্লাস ব্যবহার করে গতিশীল হতে পারে, যে লাইব্রেরি অন্তর্ভুক্ত করা হয়। আমার JSON স্ট্রিং এই ক্লাস প্রতিনিধিত্ব করে:

public class Foo {
   public int Age {get;set;}
   public Bar Bar {get;set;}
}

public class Bar {
   public DateTime BDay {get;set;}
}

এখন আমরা উপরের ক্লাস উল্লেখ না করে স্ট্রিংকে deserialize:

var dyn = JsonConvert.DeserializeObject<JObject>(jsonAsFooString);

JProperty propAge = dyn.Properties().FirstOrDefault(i=>i.Name == "Age");
if(propAge != null) {
    int age = int.Parse(propAge.Value.ToString());
    Console.WriteLine("age=" + age);
}

//or as a one-liner:
int myage = int.Parse(dyn.Properties().First(i=>i.Name == "Age").Value.ToString());

অথবা যদি আপনি গভীর যেতে চান:

var propBar = dyn.Properties().FirstOrDefault(i=>i.Name == "Bar");
if(propBar != null) {
    JObject o = (JObject)propBar.First();
    var propBDay = o.Properties().FirstOrDefault (i => i.Name=="BDay");
    if(propBDay != null) {
        DateTime bday = DateTime.Parse(propBDay.Value.ToString());
        Console.WriteLine("birthday=" + bday.ToString("MM/dd/yyyy"));
    }
}

//or as a one-liner:
DateTime mybday = DateTime.Parse(((JObject)dyn.Properties().First(i=>i.Name == "Bar").First()).Properties().First(i=>i.Name == "BDay").Value.ToString());

একটি সম্পূর্ণ উদাহরণ জন্য post দেখুন।


JsonFx গতিশীল বস্তু জেসন deserialize করতে পারেন।

https://github.com/jsonfx/jsonfx

গতিশীল ধরনের থেকে / সিরিয়ালাইজ করুন (.NET 4.0 এর জন্য ডিফল্ট):

var reader = new JsonReader(); var writer = new JsonWriter();

string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";
dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}

আপনি using Newtonsoft.Json ব্যবহার using Newtonsoft.Json ব্যবহার করতে পারেন

var jRoot = 
 JsonConvert.DeserializeObject<dynamic>(Encoding.UTF8.GetString(resolvedEvent.Event.Data));

resolvedEvent.Event.Data কোর ইভেন্ট আহ্বান থেকে আমার প্রতিক্রিয়া হচ্ছে।


আপনি বস্তু (গুলি) প্রসারিত করার জন্য তৈরি অভিধানটি ক্রমাগতভাবে অনুলিপি করতে এবং তারপরে গতিশীলভাবে ব্যবহার করতে JavaScriptSerializer প্রসারিত করতে পারেন:

static class JavaScriptSerializerExtensions
{
    public static dynamic DeserializeDynamic(this JavaScriptSerializer serializer, string value)
    {
        var dictionary = serializer.Deserialize<IDictionary<string, object>>(value);
        return GetExpando(dictionary);
    }

    private static ExpandoObject GetExpando(IDictionary<string, object> dictionary)
    {
        var expando = (IDictionary<string, object>)new ExpandoObject();

        foreach (var item in dictionary)
        {
            var innerDictionary = item.Value as IDictionary<string, object>;
            if (innerDictionary != null)
            {
                expando.Add(item.Key, GetExpando(innerDictionary));
            }
            else
            {
                expando.Add(item.Key, item.Value);
            }
        }

        return (ExpandoObject)expando;
    }
}

তারপরে আপনার কেবলমাত্র এক্সটেনশানটিকে সংজ্ঞায়িত করা নামপাসের জন্য ব্যবহার করার বিবৃতি থাকা দরকার (শুধুমাত্র System.Web.Script.Serialization এ তাদের সংজ্ঞায়িত বিবেচনা করুন ... আরেকটি কৌশল হল একটি নামস্থান ব্যবহার না করা, তারপরে আপনার ব্যবহারের প্রয়োজন নেই বিবৃতি সব) এবং আপনি তাদের মত গ্রাস করতে পারেন:

var serializer = new JavaScriptSerializer();
var value = serializer.DeserializeDynamic("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

var name = (string)value.Name; // Jon Smith
var age = (int)value.Age;      // 42

var address = value.Address;
var city = (string)address.City;   // New York
var state = (string)address.State; // NY

আমি ডায়নামিকজsonকোভার্টারের একটি নতুন সংস্করণ তৈরি করেছি যা এক্সপান্ডো অবজেক্টস ব্যবহার করে। আমি প্রসারিত বস্তুগুলি ব্যবহার করেছি কারণ আমি জেসন.net ব্যবহার করে গতিশীল ব্যাকটি সিরিয়ালাইজ করতে চাই।

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Web.Script.Serialization;

public static class DynamicJson
{
    public static dynamic Parse(string json)
    {
        JavaScriptSerializer jss = new JavaScriptSerializer();
        jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

        dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic;
        return glossaryEntry;
    }

    class DynamicJsonConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");

            var result = ToExpando(dictionary);

            return type == typeof(object) ? result : null;
        }

        private static ExpandoObject ToExpando(IDictionary<string, object> dictionary)
        {
            var result = new ExpandoObject();
            var dic = result as IDictionary<String, object>;

            foreach (var item in dictionary)
            {
                var valueAsDic = item.Value as IDictionary<string, object>;
                if (valueAsDic != null)
                {
                    dic.Add(item.Key, ToExpando(valueAsDic));
                    continue;
                }
                var arrayList = item.Value as ArrayList;
                if (arrayList != null && arrayList.Count > 0)
                {
                    dic.Add(item.Key, ToExpando(arrayList));
                    continue;
                }

                dic.Add(item.Key, item.Value);
            }
            return result;
        }

        private static ArrayList ToExpando(ArrayList obj)
        {
            ArrayList result = new ArrayList();

            foreach (var item in obj)
            {
                var valueAsDic = item as IDictionary<string, object>;
                if (valueAsDic != null)
                {
                    result.Add(ToExpando(valueAsDic));
                    continue;
                }

                var arrayList = item as ArrayList;
                if (arrayList != null && arrayList.Count > 0)
                {
                    result.Add(ToExpando(arrayList));
                    continue;
                }

                result.Add(item);
            }
            return result;
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }
        }
    }
}  

আমি ব্যবহার করি: http://json2csharp.com/ জেস অবজেক্টের প্রতিনিধিত্বকারী একটি শ্রেণি পেতে।

ইনপুট:

{
   "name":"John",
   "age":31,
   "city":"New York",
   "Childs":[
      {
         "name":"Jim",
         "age":11
      },
      {
         "name":"Tim",
         "age":9
      }
   ]
}

আউটপুট:

public class Child
{
    public string name { get; set; }
    public int age { get; set; }
}

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public string city { get; set; }
    public List<Child> Childs { get; set; }
}

তারপরে আমি Newtonsoft.Json পূরণ করতে Newtonsoft.Json ব্যবহার Newtonsoft.Json :

using Newtonsoft.Json;

namespace GitRepositoryCreator.Common
{
    class JObjects
    {
        public static string Get(object p_object)
        {
            return JsonConvert.SerializeObject(p_object);
        }
        internal static T Get<T>(string p_object)
        {
            return JsonConvert.DeserializeObject<T>(p_object);
        }
    }
}

আপনি এটির মতো কল করতে পারেন:

Person jsonClass = JObjects.Get<Person>(stringJson);

string stringJson = JObjects.Get(jsonClass);

দ্রষ্টব্য:

যদি আপনার জসন ভেরিয়েবল নাম কোন বৈধ C # নাম (নাম $ দিয়ে শুরু হয়) তাহলে আপনি এটির মতো ঠিক করতে পারেন:

public class Exception
{
   [JsonProperty(PropertyName = "$id")]
   public string id { get; set; }
   public object innerException { get; set; }
   public string message { get; set; }
   public string typeName { get; set; }
   public string typeKey { get; set; }
   public int errorCode { get; set; }
   public int eventId { get; set; }
}

একটি ExpandoObject পেতে:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

Container container = JsonConvert.Deserialize<Container>(jsonAsString, new ExpandoObjectConverter());

এটা Json.NET ব্যবহার করে বেশ সহজ।

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

এছাড়াও using Newtonsoft.Json.Linq :

dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

ডকুমেন্টেশন: গতিশীল সঙ্গে JSON কোয়েরি


এটি সম্ভবত আপনাকে সাহায্য করার জন্য কিছুটা দেরি হয়ে গেছে তবে আপনি যে বস্তুটি চান তা DynamicJSONObject ASP.NET ওয়েব পৃষ্ঠাগুলির প্যাকেজ থেকে System.Web.Helpers.dll এ অন্তর্ভুক্ত রয়েছে যা ওয়েবম্যাট্রিক্সের অংশ।


এর জন্য আমি JSON.NET ব্যবহার করে JSON প্রবাহের নিম্ন স্তরের পার্সিং করতে এবং তারপর ExpandoObject ক্লাসের দৃষ্টান্ত থেকে বস্তু শ্রেণীবিন্যাস তৈরি করব।


সহজ "স্ট্রিং জসন তথ্য" কোনো তৃতীয় পক্ষের ডিল ছাড়া বস্তু

WebClient client = new WebClient();
string getString = client.DownloadString("https://graph.facebook.com/zuck");


JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>(getString);
string name = item["name"];

//note: JavaScriptSerializer in this namespaces
//System.Web.Script.Serialization.JavaScriptSerializer 

নোট: আপনি আপনার নিজস্ব বস্তু ব্যবহার করতে পারেন।

Personel item = serializer.Deserialize<Personel>(getString);

সহজ উপায়

শুধু এই dll অন্তর্ভুক্ত

এই মত কোড ব্যবহার করুন

dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
//json.a is

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the  json[0].b/json[1].c to get the num.

Newtonsoft.Json ব্যবহার করে আরেকটি উপায়:

dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;

Cinchoo ETL - ডায়নামিক অবজেক্টের মধ্যে জেসন পার্স করতে উপলব্ধ একটি ওপেন সোর্স লাইব্রেরি

string json = @"{
    ""key1"": [
        {
            ""action"": ""open"",
            ""timestamp"": ""2018-09-05 20:46:00"",
            ""url"": null,
            ""ip"": ""66.102.6.98""
        }
    ]
}";
using (var p = ChoJSONReader.LoadText(json)
    .WithJSONPath("$.*")
    )
{
    foreach (var rec in p)
    {
        Console.WriteLine("action: " + rec.action);
        Console.WriteLine("timestamp: " + rec.timestamp);
        Console.WriteLine("url: " + rec.url);
        Console.WriteLine("ip: " + rec.ip);
    }
}

আউটপুট:

action: open
timestamp: 2018-09-05 20:46:00
url: http://www.google.com
ip: 66.102.6.98

Disclaimer: আমি এই লাইব্রেরি লেখক।





dynamic