সি # ডায়নামিক অবজেক্টে জেএসওনকে ডিসিজায়াল করবেন?


965

জেএসওএন বিষয়বস্তুকে একটি সি # 4 ডায়নামিক ধরণের ডিজাইরিয়াল করার কোনও উপায় আছে কি? এটি ব্যবহার করার জন্য ক্লাসগুলির একটি গুচ্ছ তৈরি করা এড়ানো ভাল হবে DataContractJsonSerializer


5
আপনি যদি কিছু 'গতিশীল' চান, তবে বেশিরভাগ JSON ডিকোডারের সাথে আসা গেট-স্টাইল অ্যাকসেসরগুলি কেন ব্যবহার করবেন না যা সাধারণ-পুরাতন-অবজেক্টে যায় না? (যেমন, 'ডায়নামিক' অবজেক্ট তৈরির কি সত্যই দরকার আছে?) json.org এর সি # জেএসএন বাস্তবায়নের জন্য একগুচ্ছ লিঙ্ক রয়েছে।

আমি এমন একটি প্রকল্পে কাজ করছি যা বাহ্যিক নির্ভরতা সর্বনিম্ন রাখার চেষ্টা করছে। সুতরাং যদি এটি স্টক দিয়ে কিছু সম্ভব হয়। নেট সিরিয়ালাইজার এবং প্রকারগুলি পছন্দ করা হবে। অবশ্যই যদি এটি সম্ভব না হয় তবে আমি json.org এ হিট করছি। ধন্যবাদ!
জেসওয়ানসন

42
আমি সত্যিই বিস্মিত হয়েছি সি টিমটি 'ডায়নামিক' যুক্ত করেছে তবে তারপরে কোনও সিএসআর-তে কোনও জেএসওএন অবজেক্টকে ডায়নামিক সিএলআর শ্রেণীর উদাহরণে রূপান্তর করার উপায় নেই।
ফ্র্যাঙ্ক শোয়েটারম্যান

2
দুর্ভাগ্যক্রমে গৃহীত উত্তর .NET 4 আরটিএম এ কাজ করে না। আমি একটি উত্তর পোস্ট করেছি যা আমাকে এটির সাথে যেতে সাহায্য করেছে যা অন্যের পক্ষে কার্যকর হতে পারে।
ড্রয় নোকস

(যদিও এটি দেখা যাচ্ছে যে নিউটসনফট জেএসএন.এনইটি খুব কাছাকাছি এসেছে। তবে এর চেয়ে ভাল কোনও উদাহরণ নেই))
হট লিক্স

উত্তর:


659

আপনি যদি System.Web.Helpersসমাবেশের উপর নির্ভরতা পেয়ে খুশি হন তবে আপনি Jsonশ্রেণিটি ব্যবহার করতে পারেন :

dynamic data = Json.Decode(json);

এটি NV 4 ফ্রেমওয়ার্কের অতিরিক্ত ডাউনলোড হিসাবে এমভিসি ফ্রেমওয়ার্কের সাথে অন্তর্ভুক্ত । যদি সহায়ক হয় তবে ভ্লাদকে একটি উত্সাহ দিতে ভুলবেন না! তবে আপনি যদি ক্লায়েন্ট পরিবেশে এই ডিএলএল অন্তর্ভুক্ত করে ধরে নিতে না পারেন তবে পড়ুন।


একটি বিকল্প deserialisation পদ্ধতির পরামর্শ এখানে দেওয়া হয় । আমি বাগটি ঠিক করতে এবং আমার কোডিং স্টাইল অনুসারে কোডটি কিছুটা সংশোধন করেছি। System.Web.Extensionsআপনার প্রকল্পের কেবল একটি কোড এবং একটি রেফারেন্সের জন্য আপনাকে যা দরকার তা হল :

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

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

        return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;
    }

    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) })); }
    }

    #region Nested type: DynamicJsonObject

    private sealed class DynamicJsonObject : DynamicObject
    {
        private readonly IDictionary<string, object> _dictionary;

        public DynamicJsonObject(IDictionary<string, object> dictionary)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");
            _dictionary = dictionary;
        }

        public override string ToString()
        {
            var sb = new StringBuilder("{");
            ToString(sb);
            return sb.ToString();
        }

        private void ToString(StringBuilder sb)
        {
            var firstInDictionary = true;
            foreach (var pair in _dictionary)
            {
                if (!firstInDictionary)
                    sb.Append(",");
                firstInDictionary = false;
                var value = pair.Value;
                var name = pair.Key;
                if (value is string)
                {
                    sb.AppendFormat("{0}:\"{1}\"", name, value);
                }
                else if (value is IDictionary<string, object>)
                {
                    new DynamicJsonObject((IDictionary<string, object>)value).ToString(sb);
                }
                else if (value is ArrayList)
                {
                    sb.Append(name + ":[");
                    var firstInArray = true;
                    foreach (var arrayValue in (ArrayList)value)
                    {
                        if (!firstInArray)
                            sb.Append(",");
                        firstInArray = false;
                        if (arrayValue is IDictionary<string, object>)
                            new DynamicJsonObject((IDictionary<string, object>)arrayValue).ToString(sb);
                        else if (arrayValue is string)
                            sb.AppendFormat("\"{0}\"", arrayValue);
                        else
                            sb.AppendFormat("{0}", arrayValue);

                    }
                    sb.Append("]");
                }
                else
                {
                    sb.AppendFormat("{0}:{1}", name, value);
                }
            }
            sb.Append("}");
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (!_dictionary.TryGetValue(binder.Name, out result))
            {
                // return null to avoid exception.  caller can check for null this way...
                result = null;
                return true;
            }

            result = WrapResultObject(result);
            return true;
        }

        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            if (indexes.Length == 1 && indexes[0] != null)
            {
                if (!_dictionary.TryGetValue(indexes[0].ToString(), out result))
                {
                    // return null to avoid exception.  caller can check for null this way...
                    result = null;
                    return true;
                }

                result = WrapResultObject(result);
                return true;
            }

            return base.TryGetIndex(binder, indexes, out result);
        }

        private static object WrapResultObject(object result)
        {
            var dictionary = result as IDictionary<string, object>;
            if (dictionary != null)
                return new DynamicJsonObject(dictionary);

            var arrayList = result as ArrayList;
            if (arrayList != null && arrayList.Count > 0)
            {
                return arrayList[0] is IDictionary<string, object> 
                    ? new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x))) 
                    : new List<object>(arrayList.Cast<object>());
            }

            return result;
        }
    }

    #endregion
}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

string json = ...;

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

dynamic obj = serializer.Deserialize(json, typeof(object));

সুতরাং, একটি JSON স্ট্রিং দেওয়া হয়েছে:

{
  "Items":[
    { "Name":"Apple", "Price":12.3 },
    { "Name":"Grape", "Price":3.21 }
  ],
  "Date":"21/11/2010"
}

নিম্নলিখিত কোডটি রানটাইমের সময় কাজ করবে:

dynamic data = serializer.Deserialize(json, typeof(object));

data.Date; // "21/11/2010"
data.Items.Count; // 2
data.Items[0].Name; // "Apple"
data.Items[0].Price; // 12.3 (as a decimal)
data.Items[1].Name; // "Grape"
data.Items[1].Price; // 3.21 (as a decimal)

1
ডায়নামিক অজেক্টে = সিরিয়ালাইজারে আমি একটি ত্রুটি পেয়েছি eseডিজারালাইজ (জসন, টাইপফ (অবজেক্ট)); বলছেন যে 2 টি যুক্তিযুক্ত পদ্ধতির জন্য কোনও ওভারলোড নেই..আপনি ভুল বা কী?
স্টিভি গ্রিফিন

32
আপনি System.Web.Helpers.Json ব্যবহার করতে পারেন - এটি একটি ডিকোড পদ্ধতি সরবরাহ করে যা একটি ডায়নামিক অবজেক্ট দেয়। আমি উত্তর হিসাবে এই তথ্য পোস্ট করেছি।
ভ্লাদ ইলিস্কু

2
এটি আমাকে আরও অনেক সাহায্য করেছে, তবে আমি .সিরাইজ পদ্ধতিটি ব্যবহার করতে চাইলে আমার কী করা উচিত তা জানতে আগ্রহী, যা বর্তমানে কেবল একটি নোটইম্প্লেমেন্টেড এক্সেক্সশন ছুড়ে ফেলেছে ... আমি সিল করা ক্লাস এবং / অথবা বর্ধিত বিমূর্তের সাথে খুব বেশি পরিচিত নই ক্লাস। কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে?
Cory ডব্লিউ

2
কখনও কখনও জেএসে আপনার "ব্যাকগ্রাউন্ড কালার" এর মতো বিশেষ অক্ষর সহ ক্ষেত্র থাকে। জেএসে এই জাতীয় ক্ষেত্রগুলি অ্যাক্সেস করতে আপনি আপত্তি ["ব্যাকগ্রাউন্ড-রঙ"] করেন। গতিশীল অবজেক্টে ডেসিরিয়ালাইজ করার পরে আমি কীভাবে এই জাতীয় ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারি? আমি অবশ্যই আবজ.ব্যাকগ্রাউন্ড-কালার করতে পারি না এবং অবশ্যই ["ব্যাকগ্রাউন্ড-কালার"] কাজ করছে বলে মনে হয় না। এটি জেএস-এর মতো একই সময়ে ডায়নামিক অবজেক্টটি অভিধান হিসাবেও অ্যাক্সেস করা যেতে পারে তবে এটি দুর্দান্ত হবে।
রাদু সিমিনেস্কু

2
@ রাদুসিমিনেস্কু আমি সম্ভবত কিছুটা দেরি করেছি, তবে সম্ভবত এটি ভবিষ্যতের দর্শকদের সহায়তা করে। আমার একই সমস্যা ছিল, কেবল ফিল্ড-নেম params(যা সি # এর একটি কীওয়ার্ড) দিয়ে। উপরন্তু করার জন্য TryGetMemberআপনি ওভাররাইড করতে পারে TryGetIndex, যা আপনি জাতীয় হিসেবে ঠিক একই আচরণ করে। তারপরে আপনি করতে obj["params"]বা obj["background-color"]বিশ্রী ক্ষেত্রের নামগুলি করতে পারেন ।
মার্টিন এন্ডার

606

এটি 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 অনুসন্ধান করা Qu


9
@ হটলিক্স: ডায়নামিককে আত্মনির্মাণের জন্য stuffএমন কিছু করুন:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
ম্যাথিয়াস

11
জসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট এবং জবজেক্ট.পার্সের মধ্যে পার্থক্য কী? উত্তরটি উভয়কে একই জিনিস করতে একইভাবে ব্যবহার করছে তবে পার্থক্যটি ব্যাখ্যা করে না।
সিজেএ

7
@ টমপ্যাপলো এটি চেষ্টা করেছেন। এটি আমার পক্ষে কাজ করে না। এটি বলে যে "জবজেক্ট 'নাম' প্রয়োগ করে না"।
লি লুভিয়ের

4
@cja কোনো পার্থক্য: stackoverflow.com/questions/23645034/...
nawfal

7
আমি এটি কাজ করতে পারি না। আমি বিষয়টি একটি asyncপদ্ধতির অভ্যন্তরে সংকুচিত করেছি । আমি যদি পদ্ধতিটি সিঙ্ক্রোনাস করি তবে এটি প্রত্যাশার মতো কাজ করে। তবে, পদ্ধতিটি তৈরি করুন asyncএবং আমি একটি পেতে পারি নাdynamic , আমি কেবল একটি পেয়েছি object। সুস্পষ্ট কাস্টিং কিছুই করে না, এখনও আমাকে একটি দেয় object। এরকম কি আর কারো সাথে ঘটেছে?
কোডকনশন

295

আপনি এটি System.Web.Helpers.Json ব্যবহার করে করতে পারেন - এর ডিকোড পদ্ধতিটি একটি গতিশীল অবজেক্ট দেয় যা আপনি পছন্দ মতো ট্র্যাভার করতে পারেন।

এটি System.Web.Helpers সমাবেশ (। নেট 4.0) এর অন্তর্ভুক্ত।

var dynamicObject = Json.Decode(jsonString);

25
FYI System.Web.Helpers.dll এর জন্য .net 4.0 প্রয়োজন তবে এটি নেট 4.0 তে অন্তর্ভুক্ত নয়। এটি
এএসপি.নেট

7
ভিজ্যুয়াল স্টুডিও ২০১২
সমাবেশটি পাবেন

1
গতিশীল ব্যবহার করে কোন সমস্যা? যদি ইনপুট জেএসওন বৈশিষ্ট্যগুলি না রাখে আমরা কীভাবে দক্ষতার সাথে ব্যতিক্রমগুলি পরিচালনা করতে পারি ..
উসামা খলিল

5
আপনি যদি দৃ strongly়ভাবে মডেলটি টাইপ করতে চান তবে জাসন.ডেকোড <টি> (স্ট্রিং) পদ্ধতিটি ব্যবহার করতে ভুলবেন না।
মাইক 20

2
: আপনার প্রকল্প এই লাইব্রেরি যোগ করতে stackoverflow.com/questions/8037895/...

80

.NET 4.0 এর জন্য একটি অন্তর্নির্মিত গ্রন্থাগার রয়েছে:

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

এটি সহজতম উপায়।


27
তুমি কি এটা চেষ্টা করেছ? এটি ফিরে আসে Dictionary<string,object>। আমি যদি কিছু মিস করি না, তবে আপনার উদাহরণটি গতিশীল কোনও বস্তু ফেরায় না।
সার্জিওপিরের

18
এটি কাজ করে না, এটি কেবল গতিশীল আকারে ডিক
ফেরায়

55
@ পিটার লং আমি বিশ্বাস করি যে আমি আমার মামলাটি পরিষ্কারভাবে বলতে ব্যর্থ হয়েছি, প্রিয় বন্ধু। আমাকে আমার ত্রুটি সংশোধন করার চেষ্টা করা যাক। ডায়নামিক কী তা আমি জানি। এটি আপনাকে কোনও জেএসওএন অবজেক্টে যেতে এবং ডি কোড কোড ব্যবহার করতে দেয় না, আপনাকে ডি ["কোড"] করতে হবে। মান, যা এই উত্তরটি খুঁজে পাওয়া বেশিরভাগ লোক চায় না, আমরা ইতিমধ্যে জানি কীভাবে অভিধানটি পান এবং ডায়নামিকের কাছে কাস্টিং করা মোট সময় অপচয়। আমি শ্রদ্ধার সাথে একমত, স্যার।
mattmanser

4
@ ম্যাটম্যানসার we already know how to get the dictionary and casting it to a dynamic,। এটি একটি কাল্পনিক হতে হবে না। অভিধানের পাশাপাশি জসনেরও তালিকাগুলি রয়েছে। এবং এছাড়াও তালিকা এবং অভিধান নেস্ট করা যেতে পারে। আমার কোড এই সমস্ত পরিস্থিতিতে পরিচালনা করতে পারে। তবে আপনার পদ্ধতিটি তা করতে পারে না।
পিটার লং

4
@ ম্যাটম্যানসার ঠিক আছে; বৈশিষ্ট্যগুলি বাধা দিতে এবং একটি অভ্যন্তরীণ অভিধানে এগুলি সন্ধান করতে সক্ষম এমন IDynamicMetaObjectProvider(বা উদাহরণস্বরূপ ব্যবহার ExpandoObject) প্রয়োগ করা সম্ভব । এটি ব্যবহারের মতো dynamicঅনুমতি কোডের ব্যবহারের সাথে মিলিত d.code। ডায়নামিকের কাছে ডিকশনারি কাস্ট করা অর্থহীন।
স্টিফেন ড্র 16

78

কোনও তৃতীয় পক্ষের ডিএলএল ফাইল ছাড়াই সাধারণ "স্ট্রিং জেএসএন ডেটা":

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);

4
আইডি এটি না। এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান এবং কেউই এর উল্লেখ করে না।
সিকাতোমো

2
হ্যাঁ এটি সহজ :) একসময় আপনার সিরিয়ালাইজ করা দরকার তবে তৃতীয় অংশের dll অন্তর্ভুক্ত করতে চান না
ইব্রাহিম Özbölük

আপনার উপর সম্প্রসারিত করতে পারেন: কিভাবে গতিশীল মাধ্যমে DEserialized বস্তুর অ্যাক্সেস করতে পারে: myObject["myprop"]? আমি জানি এটি রানটাইম এ সম্পন্ন হয়েছে তবে কীভাবে এটির মাধ্যমে অ্যাক্সেস myObject["myprop"]করা বৈধ?
রই নমির

1
আপনি পার্সোনেল আইটেম = সিরিয়ালাইজারের মতো আপনার অবজেক্টটি ডিসরিয়ালাইজ করতে পারেন <<পার্সোনেল> (গেটস্ট্রিং); এবং আপনি যদি গতিশীল অবজেক্ট ব্যবহার করেন তবে আপনি অ্যারেও ব্যবহার করতে পারেন এবং সবকিছুই অ্যবলোজেক্টের মতোই সম্ভব
İब्रাহিম Özbölük

3
System.Web.Script.Serialization নেমস্পেসটি ব্যবহার করতে আপনার প্রকল্পের সিস্টেম.সাহা.বি। এক্সটেনশনগুলির একটি রেফারেন্স প্রয়োজন।
স্টিলগারআইএসসিএ

28

জসনএফএক্স জেএসএএন সামগ্রীকে গতিশীল অবজেক্টগুলিতে ডিসরিয়ালাইজ করতে পারে।

ডায়নামিক টাইপগুলিতে / থেকে ক্রমিক করুন (.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]}

19

আমি ডায়নামিকজেসন কনভার্টারের একটি নতুন সংস্করণ তৈরি করেছি যা Expando অবজেক্ট ব্যবহার করে। আমি প্রসারিত বস্তু ব্যবহার করেছি, কারণ আমি জেসন.এনইটি ব্যবহার করে ডায়নামিকটি জেএসএন-এ ফিরে যেতে চাইছিলাম।

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) })); }
        }
    }
}


13

আপনি নিউটনসফট.জসনের সহায়তায় এটি অর্জন করতে পারেন। নিউগেট এবং এটি থেকে নিউটনসফট.জসন ইনস্টল করুন:

using Newtonsoft.Json;

dynamic results = JsonConvert.DeserializeObject<dynamic>(YOUR_JSON);

8

সবচেয়ে সহজ উপায়:

এই ডিএলএল ফাইলটি কেবল অন্তর্ভুক্ত করুন

কোডটি এভাবে ব্যবহার করুন:

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.

6

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

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;
    }
}

তারপরে আপনার কেবলমাত্র নামের স্থানটির জন্য এক্সটেনশনটি সংজ্ঞায়িত করার জন্য একটি ব্যবহারের বিবরণী থাকা দরকার (কেবলমাত্র সিস্টেম.ওয়েব.সক্রিপস.সিরিয়ালাইজে তাদের সংজ্ঞা দেওয়ার বিষয়ে বিবেচনা করুন ... অন্য কৌশলটি নামস্থান ব্যবহার না করা, তারপরে আপনার ব্যবহারের প্রয়োজন হবে না বিবৃতি মোটামুটি) এবং আপনি সেগুলি তাদের মতো গ্রাস করতে পারেন:

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

6

তুমি ব্যবহার করতে পার using Newtonsoft.Json

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

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


6

JSON অবজেক্টের প্রতিনিধিত্ব করে এমন একটি ক্লাস পেতে আমি 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; }
}

এর পরে আমি ক্লাসটি পূরণ করতে নিউটনসফট.জসন ব্যবহার করি :

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);

পুনশ্চ:

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

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; }
}

5

তার জন্য আমি JSON.NET ব্যবহার করব JSON স্ট্রিমের নিম্ন-স্তরের পার্সিং করতে এবং তারপরে ExpandoObjectশ্রেণীর উদাহরণগুলির বাইরে অবজেক্ট হায়ারার্কি তৈরি করব ।


5

আমি আমার কোডে এটি ব্যবহার করছি এবং এটি ঠিকঠাক কাজ করছে

using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);

1
তবে প্রশ্নটি যা জিজ্ঞাসা করছে তা নয়। যখন আপনাকে প্রতিটি জসন স্ট্রিংয়ের জন্য টাইপ নির্দিষ্ট করতে হয় এবং ডায়নামিক টাইপের সাথে কাজ করতে হয় তখন আলাদা হয়।
ইলুমিনাতি

5

কোডপ্রজেক্টে আমি যে নিবন্ধটি লিখেছি তা দেখুন, যা একটি প্রশ্নের উত্তর দেয়:

JSON.NET সহ গতিশীল প্রকারগুলি

এখানে সমস্ত এটি পুনরায় পোস্ট করার জন্য অনেক বেশি উপায় রয়েছে এবং এমনকি নিবন্ধটি কী / প্রয়োজনীয় উত্স ফাইলের সাথে একটি সংযুক্তি রয়েছে বলেও কম বিষয়।


5

আরেকটি বিকল্প হ'ল "JSON কে ক্লাস হিসাবে আটকান" যাতে এটি দ্রুত এবং সহজেই deserialised করা যায়।

  1. কেবল আপনার পুরো JSON অনুলিপি করুন
  2. ভিসুয়াল স্টুডিও ইন: ক্লিক করুন সম্পাদনাপেস্ট স্পেশালক্লাস হিসেবে JSON আটকান

এখানে আরও ভালো ব্যাখ্যা এন পিকাস ... এএসপি.এনইটি এবং ওয়েব টুলস ২০১২.২ আরসিতে 'ক্লাস হিসাবে জেএসএন আটকান'


এটি আমার অনেক সময় বাঁচায়! সেরা উত্তর হিসাবে চয়ন করা উচিত!
জিয়োত 13

4

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

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

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

এখন আমরা উপরের ক্লাসগুলিকে উল্লেখ না করে স্ট্রিংকে ডিসরিয়ালাইজ করি:

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());

সম্পূর্ণ উদাহরণের জন্য পোস্ট দেখুন ।


এই পদ্ধতির jSON নথিটিকে "ট্র্যাভার্স" করার অনুমতি দেয়, যাতে আপনি JSON কাঠামোটি অজানা বা পরিবর্তনশীল যেখানে পরিস্থিতি পরিচালনা করতে পারেন (উদাহরণস্বরূপ, কোনও ত্রুটি ঘটলে অনেকগুলি এপিআই সম্পূর্ণ আলাদা JSON নথি ফেরত দেয়)। নিউটোনসফট.জেএসএন (ওরফে জেএসওএন.এনইটি) ব্যতীত অন্যান্য লাইব্রেরি রয়েছে যা করার অনুমতি দেয়?
অ্যালেক্স 75

4

আপনি যে বস্তুটি ডায়নামিকজেএসএসওনবজেক্ট চান তা কম্পিউটারে অন্তর্ভুক্ত রয়েছে।এসপি.এনইটি ওয়েব পৃষ্ঠাগুলি প্যাকেজ থেকে ওয়েব.হেল্পার্স.ডিএল, যা ওয়েবম্যাট্রিক্সের অংশ।


4

সিম্পলজসন নামে সি # এর জন্য একটি লাইটওয়েট জেএসএন লাইব্রেরি রয়েছে

এটি .NET 3.5+, সিলভারলাইট এবং উইন্ডোজ ফোন 7 সমর্থন করে।

এটি .NET 4.0 এর জন্য গতিশীল সমর্থন করে

এটি একটি নিউগেট প্যাকেজ হিসাবে ইনস্টল করা যেতে পারে

Install-Package SimpleJson

4

জাভাস্ক্রিপ্ট সহ ডেটাসেট (সি #) ব্যবহার করুন। ডেটাসেট ইনপুট সহ একটি JSON স্ট্রিম তৈরি করার জন্য একটি সাধারণ ফাংশন। (মাল্টি টেবিল ডেটাসেট) এর মতো JSON সামগ্রী তৈরি করুন:

[[{a:1,b:2,c:3},{a:3,b:5,c:6}],[{a:23,b:45,c:35},{a:58,b:59,c:45}]]

শুধু ক্লায়েন্ট পক্ষ, eval ব্যবহার করুন। উদাহরণ স্বরূপ,

var d = eval('[[{a:1,b:2,c:3},{a:3,b:5,c:6}],[{a:23,b:45,c:35},{a:58,b:59,c:45}]]')

তারপরে ব্যবহার করুন:

d[0][0].a // out 1 from table 0 row 0

d[1][1].b // out 59 from table 1 row 1

// Created by Behnam Mohammadi And Saeed Ahmadian
public string jsonMini(DataSet ds)
{
    int t = 0, r = 0, c = 0;
    string stream = "[";

    for (t = 0; t < ds.Tables.Count; t++)
    {
        stream += "[";
        for (r = 0; r < ds.Tables[t].Rows.Count; r++)
        {
            stream += "{";
            for (c = 0; c < ds.Tables[t].Columns.Count; c++)
            {
                stream += ds.Tables[t].Columns[c].ToString() + ":'" +
                          ds.Tables[t].Rows[r][c].ToString() + "',";
            }
            if (c>0)
                stream = stream.Substring(0, stream.Length - 1);
            stream += "},";
        }
        if (r>0)
            stream = stream.Substring(0, stream.Length - 1);
        stream += "],";
    }
    if (t>0)
        stream = stream.Substring(0, stream.Length - 1);
    stream += "];";
    return stream;
}


3

এটা চেষ্টা কর:

  var units = new { Name = "Phone", Color= "White" };
    var jsonResponse = JsonConvert.DeserializeAnonymousType(json, units);

3

কীভাবে ডায়নামিক এবং জাভাস্ক্রিপ্টসারিয়ালাইজার দিয়ে সহজ JSON সামগ্রী পার্স করবেন

দয়া করে System.Web.Exferences এর রেফারেন্স যুক্ত করুন এবং এই নেমস্পেসটি 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();
}

কীভাবে ডাইনামিক এবং জাভাস্ক্রিপ্টসারিয়াল দিয়ে নেস্টেড এবং জটিল জসনকে পার্স করবেন to

দয়া করে System.Web.Exferences এর রেফারেন্স যুক্ত করুন এবং এই নেমস্পেসটি 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();
}

1

সঙ্গে Cinchoo সংক্ষিপ্তসার ETL - একটি ওপেন সোর্স একটি গতিশীল বস্তুর মধ্যে তাদেরকে JSON পার্স করতে প্রাপ্তিসাধ্য গ্রন্থাগার:

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 address: " + rec.ip);
    }
}

আউটপুট:

Action: open
Timestamp: 2018-09-05 20:46:00
URL: http://www.google.com
IP address: 66.102.6.98

দাবি অস্বীকার: আমি এই গ্রন্থাগারের লেখক।


0

এইভাবে চেষ্টা করুন!

JSON উদাহরণ:

  [{
            "id": 140,
            "group": 1,
            "text": "xxx",
            "creation_date": 123456,
            "created_by": "xxx@gmail.co",
            "tags": ["xxxxx"]
        }, {
            "id": 141,
            "group": 1,
            "text": "xxxx",
            "creation_date": 123456,
            "created_by": "xxx@gmail.com",
            "tags": ["xxxxx"]
        }]

সি # কোড:

        var jsonString = (File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(),"delete_result.json")));
        var objects = JsonConvert.DeserializeObject<dynamic>(jsonString);
        foreach(var o in objects)
        {
            Console.WriteLine($"{o.id.ToString()}");
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.