আমি কীভাবে জেএসএনকে এএসপি.নেটে একটি সাধারণ অভিধান <স্ট্রিং, স্ট্রিং> এ ডিজিজায়াল করতে পারি?


682

আমার কাছে জেএসনে একটি সাধারণ কী / মান তালিকা রয়েছে যা পোস্টের মাধ্যমে এএসপি.নেটকে ফেরত পাঠানো হচ্ছে। উদাহরণ:

{ "key1": "value1", "key2": "value2"}

আমি শক্ত-টাইপযুক্ত। ডিজিটাল উদ্দেশ্য নিখুঁত করার চেষ্টা করছি না

আমার কেবল একটি সরল পুরাতন অভিধান (স্ট্রিং, স্ট্রিং) বা কিছু সমতুল্য (হ্যাশ টেবিল, অভিধান (স্ট্রিং, অবজেক্টের), পুরানো-স্কুল স্ট্রিংডোরিয়ালটি দরকার - নরক, একটি 2-ডি স্ট্রিং আমার জন্য কাজ করবে।

আমি এএসপি.নেট 3.5 এ উপলব্ধ যে কোনও কিছু ব্যবহার করতে পারি, পাশাপাশি জনপ্রিয় জসন.এনইটি (যা আমি ইতিমধ্যে ক্লায়েন্টকে সিরিয়ালকরণের জন্য ব্যবহার করছি )।

স্পষ্টতই এই জেএসওএন লাইব্রেরির কোনওটিরই কপাল-চড় মারার স্পষ্ট সামর্থ্য বাক্সের বাইরে নেই - তারা দৃ cont়তর চুক্তির মাধ্যমে প্রতিফলন-ভিত্তিক ডিসারিয়ালাইজেশনে সম্পূর্ণ মনোনিবেশিত।

কোন ধারনা?

সীমাবদ্ধতা:

  1. আমি নিজের জেএসএন পার্সার প্রয়োগ করতে চাই না
  2. ASP.NET 4.0 এখনও ব্যবহার করতে পারবেন না
  3. জেএসএনের জন্য পুরানো, অবহেলিত এএসপি.এনইটি ক্লাস থেকে দূরে থাকতে পছন্দ করবেন

1
পুনরায়: সীমাবদ্ধতা 3, JavaScriptSerizlizerএএসপি.নেট এমভিসিতে ব্যবহৃত হয় এবং এটি আর অবচয় হয় না।
বিডুকস

17
এটি একটি জসন স্ট্রিংকে এমন কিছুতে রূপান্তরিত করার সহজ উপায়টি খুঁজে পাওয়া কতটা কঠিন ছিল যা আমি খুব সহজেই বিভিন্ন স্ট্যাকওভারফ্লোতে উল্টানো ছাড়াই সহজেই ব্যবহার করতে পারি inc এটি অন্য ভাষাগুলিতে এত সহজ তবে জাভা এবং সি # মনে হয় তাদের জীবনকে কঠিন করে তোলার উপায়টি খুব সহজেই বাইরে চলে গেছে।
ব্যবহারকারী 299709

উত্তর:


893

জসন.এনইটি এটি করে ...

string json = @"{""key1"":""value1"",""key2"":""value2""}";

var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

আরও উদাহরণ: জসন.এনইটি দিয়ে সংগ্রহগুলি সিরিয়ালিং করা হচ্ছে


9
যখন আপনার মানগুলি পূর্ণসংখ্যা হয় তখনও এটি কাজ করে? এগুলি কি স্বয়ংক্রিয়ভাবে 'স্ট্রিং'-তে জড়িত?
হাইমাস্টডন

58
@ হাইগাস্টডন না এটি হয় না। আমি dynamicJsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
অভিধানে ডেসরিয়ালাইজ

1
খুব অগোছালো কী / মান জুটির সাহায্যে এই পৃষ্ঠায় বেশ কয়েকটি উত্তর চেষ্টা করেছে এবং আমি কাজ করেছি এমন একমাত্র জেএসএন.এনইটই চেষ্টা করেছিলেন।
বিনিল্যান্ড

15
আপনি জসন-তে কী ভ্যালু জোড়গুলির একটি অ্যারে ব্যবহার করছেন তা যদি কাজ করে না তবে আপনাকে [{key: "a", value: "1"}, {key: "b", value:"2"}]এরকম কিছু করতে হবে:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
অ্যাড্রিয়ান

8
মানগুলি যদি নেস্টেড অবজেক্ট হয় তবে এটিও কাজ করে না, কারণ json.net সেগুলি JObjects হিসাবে তৈরি করে
কুগেল

100

আমি আবিষ্কার করেছিলাম .NET এর সাথে 3.5 টি বিধানসভাতে টাইপটির Dictionary<String, Object>মাধ্যমে JSON স্ট্রিংটি কাস্ট করার উপায় রয়েছে । পদ্ধতিটি ব্যবহার করুন ।System.Web.Script.Serialization.JavaScriptSerializerSystem.Web.ExtensionsDeserializeObject(String)

স্থিতিশীল। নেট পেজ মেথডে 'অ্যাপ্লিকেশন / জেসন' বিষয়বস্তুর প্রকারের অ্যাজ্যাক্স পোস্ট (জ্যাকুইয়ের মাধ্যমে) করার সময় আমি হোঁচট খেয়েছি এবং দেখলাম যে পদ্ধতিটি (যার একক প্যারামিটার টাইপ ছিল Object) ম্যাজিকভাবে এই অভিধানটি পেয়েছে।


5
তবে জাভাস্ক্রিপ্টসরিয়ালাইজারে অন্তর্নির্মিতটি json.net এর চেয়ে বগিরিয়ার, সমাধানটি আরও ভাল। উদাহরণস্বরূপ জাভাস্ক্রিপ্টরাইজার খালি স্ট্রিংয়ের পরিবর্তে নাল ফেরত দেবে, এবং নলযোগ্য বৈশিষ্ট্যগুলির জন্য মোটেও কাজ করে না, ইত্যাদি।
পাইলাভজাইস

1
@ পিলাভডজাইস এমএস-এর অ-মানক তারিখের ফর্ম্যাটটি ধরে নিলে তারিখগুলি পার্স করার সময় আপনার যে মজাদার তা উল্লেখ করার প্রয়োজন নেই।
বেসিক

16
দ্রুত কোড উদাহরণ: var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();এরপরেDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
নাট কুক

6
একটি সহজ ক্ষেত্রে নেট কুকের উদাহরণের সুবিধা হ'ল বাহ্যিক ডিএলএলগুলির প্রয়োজনীয়তা এড়ানো। আমি স্ট্যান্ড্যালোন কনসোল থেকে এমন একটি এপিআই অ্যাক্সেস করছি যা কেবল নেট ফ্রেমওয়ার্কটিতে নির্ভর করতে পারে।
নিক.টি

@ পিলাভডিজিস আপনি কি আরও বিশদে যেতে পারবেন? আমি "ফাঁকা স্ট্রিংয়ের পরিবর্তে নাল SomeData: ""
ফেরান

51

যারা ইন্টারনেট অনুসন্ধান করছেন এবং এই পোস্টে হোঁচট খাচ্ছেন তাদের জন্য, আমি কীভাবে জাভাস্ক্রিপ্টসারিয়াল ক্লাসটি ব্যবহার করব সে সম্পর্কে একটি ব্লগ পোস্ট লিখেছিলাম।

আরও পড়ুন ... http://procbit.com/2011/04/21/quick-json-seializationdeserialization-in-c/

এখানে একটি উদাহরণ:

var json = "{\"id\":\"13\", \"value\": true}";
var jss = new JavaScriptSerializer();
var table = jss.Deserialize<dynamic>(json);
Console.WriteLine(table["id"]);
Console.WriteLine(table["value"]);

এইচএম, আমি আপনার সমাধানটি চেষ্টা করেছি ... আমার কাছে এই জাতীয় id "আইডি": "13", "মান": সত্য} এবং আমার জন্য কেবল অভিধানই রয়েছে << নামাজিক> সমাধান কাজ করে
মার্কো

ঠিক আছে আমি খুঁজে পেয়েছি সমস্যাটি কোথায় ... সঠিকভাবে deserialize করার জন্য আপনাকে অভিধানের ঘোষণার পরে যুক্ত করা দরকার [আমি আপনার ব্লগ পোস্টেও মন্তব্য করছি ... চিয়ার্স;)
মার্কো

আমি আপনার নির্দিষ্ট ডেটাसेट প্রতিফলিত করতে আমার উত্তর আপডেট করেছি। এটি ডায়নামিকের সাথে সূক্ষ্মভাবে কাজ করে।
জে পি রিচার্ডসন

আমি স্রেফ আরেকটি জেএসএন
জে পি রিচার্ডসন

41

কোনও বাহ্যিক JSON বাস্তবায়ন ব্যবহার না করার চেষ্টা করেছি তাই আমি এই জাতীয়ভাবে deserialised:

string json = "{\"id\":\"13\", \"value\": true}";

var serializer = new JavaScriptSerializer(); //using System.Web.Script.Serialization;

Dictionary<string, string> values = serializer.Deserialize<Dictionary<string, string>>(json);

6
রেফারেন্স System.Web.Extensions System.Web.Script ব্যবহার করতে যোগ করুন
প্যাট্রিক কালেন

1
আমি এই উত্তরটি সবচেয়ে পছন্দ করি কারণ এটি সহজ এবং নেট ব্যবহার করে System.Web.Script.Serialization। এটা ঠিক কাজ করে। আমি এমনকি "অবৈধ" জেএসওএন পছন্দ করতে সক্ষম হয়েছি string json = "{'id':13, 'value': true}";
স্টাইল

কৌতূহলের বাইরে, অর্ডিনালইগনোর কেস অভিধানে ডিসেরিয়ালাইজ করার একই একই লাইন উপায় কি?
ব্যাটবাটার

38

আমার একই সমস্যা ছিল, তাই আমি এটি আমার নিজের লিখেছিলাম। এই সমাধানটি অন্যান্য উত্তর থেকে পৃথক করা হয়েছে কারণ এটি একাধিক স্তরে ডিসেরায়ালাইজ করতে পারে।

কেবলমাত্র JSON স্ট্রিংকে ডিসিরিয়ালাইজড টুডেটরিয়াল ফাংশন প্রেরণ করুন এটি শক্তভাবে- টাইপযুক্ত অ ফিরে আসবেDictionary<string, object> অবজেক্টটি ।

পুরাতন কোড

private Dictionary<string, object> deserializeToDictionary(string jo)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
    var values2 = new Dictionary<string, object>();
    foreach (KeyValuePair<string, object> d in values)
    {
        // if (d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
        if (d.Value is JObject)
        {
            values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
        }
        else
        {
            values2.Add(d.Key, d.Value);
        }
    }
    return values2;
}

প্রাক্তন: এটি ফিরে আসবে Dictionary<string, object> একটি ফেসবুক জেএসওএন প্রতিক্রিয়াকে ।

পরীক্ষা

private void button1_Click(object sender, EventArgs e)
{
    string responsestring = "{\"id\":\"721055828\",\"name\":\"Dasun Sameera Weerasinghe\",\"first_name\":\"Dasun\",\"middle_name\":\"Sameera\",\"last_name\":\"Weerasinghe\",\"username\":\"dasun\",\"gender\":\"male\",\"locale\":\"en_US\",  hometown: {id: \"108388329191258\", name: \"Moratuwa, Sri Lanka\",}}";
    Dictionary<string, object> values = deserializeToDictionary(responsestring);
}

দ্রষ্টব্য: হোমটাউন আরও একটি Dictionary<string, object> বস্তুর মধ্যে deserilize ।

হালনাগাদ

JSON স্ট্রিংয়ের কোনও অ্যারে না থাকলে আমার পুরানো উত্তরটি দুর্দান্ত কাজ করে। এই এক আরও একটি deserializeList<object>উপাদানটি অ্যারে হলে ।

কেবলমাত্র একটি JSON স্ট্রিংকে ডিসিরিয়ালাইজড টু অভিধান অভিধানঅরলিস্ট ফাংশন প্রেরণ করুন এটি শক্তভাবে-টাইপযুক্ত Dictionary<string, object>অবজেক্টটি বা ফিরে আসবে List<object>

private static object deserializeToDictionaryOrList(string jo,bool isArray=false)
{
    if (!isArray)
    {
        isArray = jo.Substring(0, 1) == "[";
    }
    if (!isArray)
    {
        var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
        var values2 = new Dictionary<string, object>();
        foreach (KeyValuePair<string, object> d in values)
        {
            if (d.Value is JObject)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
            }
            else if (d.Value is JArray)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString(), true));
            }
            else
            {
                values2.Add(d.Key, d.Value);
            }
        }
        return values2;
    }else
    {
        var values = JsonConvert.DeserializeObject<List<object>>(jo);
        var values2 = new List<object>();
        foreach (var d in values)
        {
            if (d is JObject)
            {
                values2.Add(deserializeToDictionary(d.ToString()));
            }
            else if (d is JArray)
            {
                values2.Add(deserializeToDictionary(d.ToString(), true));
            }
            else
            {
                values2.Add(d);
            }
        }
        return values2;
    }
}

@ জর্ডান এই বিষয়টিকে নির্দেশ করার জন্য ধন্যবাদ, আমি এই কোডটিতে কিছু পরিবর্তন করেছি তবে এখন আমার তা নেই। এই কোডটি JArray অবজেক্টগুলি পরিচালনা করে না, আমি একবার কোডটি পেয়ে গেলে আপডেট করব।
দাসুন

1
কোন সমস্যা নেই. আমি শুধু এটা উল্লেখ কারণ সম্পর্কে জানতে isএবং asঅপারেটরদের ব্যাপকভাবে আমাকে সাহায্য করেছে এবং আমার নিজের কোড সরলীকৃত।
জর্দান

এটি কাজ করে, তবে দক্ষ নয়, কারণ এটি টুস্ট্রিংকে কল করে এবং তারপরে আবার ডিসরিওলাইজ করে। নীচে ফালকো এর উত্তর দেখুন। এটি একবারে উত্সের স্ট্রিংকে ডিসরিয়ালাইজ করা হয়।
সের্গেই জিনোভিয়েভ

1
ফ্যালকের উত্তর কেবলমাত্র যদি আপনি ডেটা কাঠামো আগে থেকেই জানতেন তবেই কাজ করে। এই সমাধানটি যে কোনও JSON স্ট্রিংয়ের জন্য ব্যবহার করতে পারে।
দাসুন

16

যদি আপনি একটি হালকা ওজনের পরে থাকেন তবে কোনও অ্যাড-রেফারেন্স ধরণের পদ্ধতির নাও হতে পারে, আমি সবে লিখেছি এই বিট কোডটি কাজ করবে (যদিও আমি 100% দৃ rob়তার গ্যারান্টি দিতে পারি না)।

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public Dictionary<string, object> ParseJSON(string json)
{
    int end;
    return ParseJSON(json, 0, out end);
}
private Dictionary<string, object> ParseJSON(string json, int start, out int end)
{
    Dictionary<string, object> dict = new Dictionary<string, object>();
    bool escbegin = false;
    bool escend = false;
    bool inquotes = false;
    string key = null;
    int cend;
    StringBuilder sb = new StringBuilder();
    Dictionary<string, object> child = null;
    List<object> arraylist = null;
    Regex regex = new Regex(@"\\u([0-9a-z]{4})", RegexOptions.IgnoreCase);
    int autoKey = 0;
    for (int i = start; i < json.Length; i++)
    {
        char c = json[i];
        if (c == '\\') escbegin = !escbegin;
        if (!escbegin)
        {
            if (c == '"')
            {
                inquotes = !inquotes;
                if (!inquotes && arraylist != null)
                {
                    arraylist.Add(DecodeString(regex, sb.ToString()));
                    sb.Length = 0;
                }
                continue;
            }
            if (!inquotes)
            {
                switch (c)
                {
                    case '{':
                        if (i != start)
                        {
                            child = ParseJSON(json, i, out cend);
                            if (arraylist != null) arraylist.Add(child);
                            else
                            {
                                dict.Add(key, child);
                                key = null;
                            }
                            i = cend;
                        }
                        continue;
                    case '}':
                        end = i;
                        if (key != null)
                        {
                            if (arraylist != null) dict.Add(key, arraylist);
                            else dict.Add(key, DecodeString(regex, sb.ToString()));
                        }
                        return dict;
                    case '[':
                        arraylist = new List<object>();
                        continue;
                    case ']':
                        if (key == null)
                        {
                            key = "array" + autoKey.ToString();
                            autoKey++;
                        }
                        if (arraylist != null && sb.Length > 0)
                        {
                            arraylist.Add(sb.ToString());
                            sb.Length = 0;
                        }
                        dict.Add(key, arraylist);
                        arraylist = null;
                        key = null;
                        continue;
                    case ',':
                        if (arraylist == null && key != null)
                        {
                            dict.Add(key, DecodeString(regex, sb.ToString()));
                            key = null;
                            sb.Length = 0;
                        }
                        if (arraylist != null && sb.Length > 0)
                        {
                            arraylist.Add(sb.ToString());
                            sb.Length = 0;
                        }
                       continue;
                    case ':':
                        key = DecodeString(regex, sb.ToString());
                        sb.Length = 0;
                        continue;
                }
            }
        }
        sb.Append(c);
        if (escend) escbegin = false;
        if (escbegin) escend = true;
        else escend = false;
    }
    end = json.Length - 1;
    return dict; //theoretically shouldn't ever get here
}
private string DecodeString(Regex regex, string str)
{
    return Regex.Unescape(regex.Replace(str, match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber))));
}

[আমি বুঝতে পারি যে এটি ওপি সীমাবদ্ধতা # 1 লঙ্ঘন করেছে, তবে প্রযুক্তিগতভাবে, আপনি এটি লেখেননি, আমি করেছি]


3
সিলভারলাইটের জন্য এবং নির্ভরতা ছাড়াই এটিই একমাত্র উত্তর! সিলভারলাইটে জাভাস্ক্রিপ্টসরিয়ালাইজার বা সিরিয়ালাইজযোগ্য নেই। এবং কোনও নির্ভরতা বলতে কোনও জসন.এনইটি, রেস্টশার্প বা মিনিজেএসএন নয়। কেবলমাত্র @ ড্যানকিশার্পস্টার আরও একটি সম্ভাব্য সমাধানের চেষ্টা করেছিলেন তবে দুর্ভাগ্যক্রমে এটি আমার মতো কাজ করছে না এটি এর মতো করে।
Cœur

1
JSON.NET এর মতো সাধারণ কিছুতে রেফারেন্স যুক্ত করতে ভুল কি? এমন কি হালকা হওয়া দরকার যে আপনি কিছু উল্লেখ করতে পারবেন না? আমি বলছি না যে আপনার কোডটি কাজ করবে না, তবে যে কোনও সময় আপনি নিজেরাই রোল করবেন, আপনি অবশ্যই স্পষ্টতই আপনার কোডটির মতো শক্তিশালী না হওয়ার ঝুঁকিটি চালাচ্ছেন, প্রান্তের মামলার মতো জিনিসগুলির জন্য, বা জেএসএন.নেটের মতো পরীক্ষিত গ্রন্থাগার হিসাবে দ্রুত fast
ড্যান সিশার্পস্টার

1
আপনার নিজের ঘূর্ণায়মান একটি খারাপ ধারণা যখন আপনার কাছে একটি ভাল বিকল্প থাকে। আমি জানি না এমন হালকা ওজনের কোনও পরিস্থিতি নেই । এবং আমার চেয়ে কম অনুকূল কোড হবে যা পড়া এবং পরিবর্তন করা সহজ।
জর্দান 16

3
আমি কোডটি মূলত লিখেছিলাম কারণ আমার কোনও বিকল্প ছিল না। সিলভারলাইট, বা অফিস পণ্যগুলির জন্য বিভিন্ন ধরণের সরবরাহকারীগুলির মতো বিষয়গুলি বিবেচনা করুন, যেখানে প্রকল্পে বাহ্যিক উল্লেখগুলি যুক্ত করা অত্যন্ত সমস্যাযুক্ত বা অসম্ভব।
ডেক্সি

আমি এটি কয়েক বছর পরে জানি, কিন্তু এটি এখনও একটি খুব কার্যকর প্রশ্ন। যে কেউ ভাবছেন যে আমরা কেন এত কম ওজন নিয়ে যেতে চাই, ভাল, আপনি যদি এসকিউএল সিএলআর সি # এর সাথে কাজ করে থাকেন তবে কেবলমাত্র অনেকগুলি "নিরাপদ" লাইব্রেরি রয়েছে যা আপনি ব্যবহার করতে সক্ষম এবং System.RunTime.Serializationসেগুলির মধ্যে একটিও নয়, দুর্ভাগ্যক্রমে JSON.NET নির্ভর করে এটি এবং এইভাবে এটি ব্যবহার করা যাবে না। আপনার দুর্দান্ত কাজের জন্য ধন্যবাদ ডেক্সি, আমি অ্যারের অ্যারেগুলি ডিসিরিয়ালাইজ করতে সক্ষম হতে কিছুটা উন্নতি করার সাহস পেয়েছিলাম, আমার উত্তরের আপডেট কোডটি এখানে দেখুন
আলবার্তো রেচি

15

আমার কেবল একটি নেস্টেড ডিকশনারি যেমন পার্স করা দরকার

{
    "x": {
        "a": 1,
        "b": 2,
        "c": 3
    }
}

কোথায় JsonConvert.DeserializeObjectসাহায্য করে না। আমি নিম্নলিখিত পদ্ধতিটি পেয়েছি:

var dict = JObject.Parse(json).SelectToken("x").ToObject<Dictionary<string, int>>();

SelectTokenআপনার পছন্দসই ক্ষেত্র নিচে খনন করতে দেয়। আপনি এমনকি "x.y.z"JSON অবজেক্টের আরও নিচে নামার মতো পথ নির্দিষ্ট করতে পারেন ।


JObject.Parse (json) .ToObject <অভিধান <নির্দেশ << নির্দেশিকা <<< >> >> () আমার পরিস্থিতিতে আমার জন্য কাজ করেছেন ধন্যবাদ
গেডব্ব

11

System.Text.Json

এটি এখন System.Text.Jsonঅন্তর্নির্মিত ব্যবহার করে করা যেতে পারে .net core 3.0। তৃতীয় পক্ষের লাইব্রেরিগুলি ব্যবহার না করেই এখন জেএসএনকে ডিসিরিয়ালাইজ করা সম্ভব ।

var json = @"{""key1"":""value1"",""key2"":""value2""}";
var values = JsonSerializer.Deserialize<Dictionary<string, string>>(json);

NET- স্ট্যান্ডার্ড বা। নেট ফ্রেমওয়ার্ক ব্যবহার করা হলে NU -get প্যাকেজ System.Text.Json এও উপলব্ধ ।


1
হ্যাঁ! System.Text.Jsonএই দিন যেতে উপায়।
mfluehr

2
হ্যাঁ, এটি আশাব্যঞ্জক দেখাচ্ছে! যাইহোক, নোট কোর 3.1 এর System.Text.Json- র ডিফল্ট সংস্করণ নন-স্ট্রিং কীগুলির সাহায্যে ডিকোরিয়াসগুলি deserializing সমর্থন করে না তা নোট করুন। যখন আমার ওপি স্ট্রিংগুলি সম্পর্কে ছিল, বাস্তবে এখন, আমার কাছে প্রচুর গাইড কী রয়েছে, তাই স্যুইচটি করার চেষ্টা করার সময় আমাকে এই "বিট" করে। এটিতে কিছু বৈশিষ্ট্যের সমতুল্যতা (প্রয়োজনীয় ইত্যাদি) নেই।
রিচার্ডাল্টলেন্ট

6

মার্ক রেন্ডেল এটিকে একটি মন্তব্য হিসাবে পোস্ট করেছেন , আমি এটিকে উত্তর হিসাবে পোস্ট করতে চেয়েছিলাম যেহেতু এটিই একমাত্র সমাধান যা এখন পর্যন্ত সফলতা এবং গুগলের পুনঃক্যাপচা প্রতিক্রিয়া থেকে ত্রুটি-কোড জাসন ফলাফলগুলি ফিরিয়ে আনতে কাজ করেছে।

string jsonReponseString= wClient.DownloadString(requestUrl);    
IDictionary<string, object> dict = new JavaScriptSerializer().DeserializeObject(jsonReponseString) as IDictionary<string, object>;

আবারও ধন্যবাদ, মার্ক!


1
জাভাস্ক্রিপ্টসরিয়ালাইজার প্রায় অবচিত করা হয়েছে। ডকুমেন্টেশনটিতে বলা হয়েছে যে আমাদের JSON.NET ( ডকস.মাইক্রোসফটকম / en- us/ dotnet/ api/ ) ব্যবহার করা উচিত
মারিও লোপেজ

আপনি অতিরিক্ত নির্ভরতা অন্তর্ভুক্ত করতে চান না এমন লিগ্যাসি ওয়েবফর্ম অ্যাপসের জন্যও ভাল good
অ্যান্ড্রু গ্রোথ

5

সম্পাদনা: এটি কাজ করে তবে জসন.এনইটি ব্যবহার করে গৃহীত উত্তরগুলি আরও সহজ। কারও ক্ষেত্রে ছাত্রলীগের একমাত্র কোডের প্রয়োজন হলে এটিকে রেখে।

এটি বক্সের বাইরে .NET ফ্রেমওয়ার্ক দ্বারা সমর্থিত নয়। একটি সুস্পষ্ট নজরদারি - প্রত্যেককে নামযুক্ত বৈশিষ্ট্যযুক্ত বস্তুগুলিতে ডিসরিয়ালাইজ করার দরকার নেই। সুতরাং আমি আমার নিজস্ব ঘূর্ণায়মান শেষ:

<Serializable()> Public Class StringStringDictionary
    Implements ISerializable
    Public dict As System.Collections.Generic.Dictionary(Of String, String)
    Public Sub New()
        dict = New System.Collections.Generic.Dictionary(Of String, String)
    End Sub
    Protected Sub New(info As SerializationInfo, _
          context As StreamingContext)
        dict = New System.Collections.Generic.Dictionary(Of String, String)
        For Each entry As SerializationEntry In info
            dict.Add(entry.Name, DirectCast(entry.Value, String))
        Next
    End Sub
    Public Sub GetObjectData(info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
        For Each key As String in dict.Keys
            info.AddValue(key, dict.Item(key))
        Next
    End Sub
End Class

এর সাথে কল করা:

string MyJsonString = "{ \"key1\": \"value1\", \"key2\": \"value2\"}";
System.Runtime.Serialization.Json.DataContractJsonSerializer dcjs = new
  System.Runtime.Serialization.Json.DataContractJsonSerializer(
    typeof(StringStringDictionary));
System.IO.MemoryStream ms = new
  System.IO.MemoryStream(Encoding.UTF8.GetBytes(MyJsonString));
StringStringDictionary myfields = (StringStringDictionary)dcjs.ReadObject(ms);
Response.Write("Value of key2: " + myfields.dict["key2"]);

C # এবং VB.NET এর মিশ্রণের জন্য দুঃখিত ...


2
[টেস্টমেথড] সর্বজনীন শূন্য টেস্টসিম্পলঅবজেক্ট () {কনস্ট্রিং জেসসন = @ "{" "নাম" ":" "বব" "," "বয়স" ": 42;"; var ডিকম = নতুন জাভাস্ক্রিপ্টসরিয়ালাইজার () De Assert.IsNotNull (অভি); Assert.IsTrue (dict.ContainsKey ( "নাম")); Assert.AreEqual ("বব", ডিক ["নাম"]); Assert.IsTrue (dict.ContainsKey ( "বয়স")); Assert.AreEqual (42, ডিক ["বয়স"]); }
মার্ক রেন্ডেল

1
এটি চমৎকার. ব্রাউজার-ভিত্তিক ক্লায়েন্টগুলির সাথে জেএসএন ব্যবহার করে ইন্টারফেসের ডাব্লুসিএফ পরিষেবা বাস্তবায়নে সহায়তা করে।
আন্তন

@ মার্ক রেন্ডেল: আপনার বাস্তবায়ন খুব সহজ, এবং কেবলমাত্র এটিই সফলতা এবং ত্রুটি-কোড উভয় ফলাফলের জন্য আমার পক্ষে কাজ করেছে j আমি অনেকগুলি সমাধান চেষ্টা করেছি, তাই মন্তব্য হিসাবে পোস্ট করার জন্য আপনাকে ধন্যবাদ। এর উত্তর হওয়া উচিত।
ব্রায়ান

5

আমি এখানে jSnake04 এবং দাশুন দ্বারা জমা দেওয়া কোড যোগ করেছি। JArrayউদাহরণগুলি থেকে অবজেক্টের তালিকা তৈরি করতে আমি কোড যুক্ত করেছি । এটির দ্বিমুখী পুনরাবৃত্তি রয়েছে তবে এটি একটি স্থির, সসীম গাছের মডেল হিসাবে কাজ করছে, ডেটা ব্যাপক না হলে স্ট্যাকের ওভারফ্লো হওয়ার ঝুঁকি নেই।

/// <summary>
/// Deserialize the given JSON string data (<paramref name="data"/>) into a
///   dictionary.
/// </summary>
/// <param name="data">JSON string.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(string data)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(data);

    return DeserializeData(values);
}

/// <summary>
/// Deserialize the given JSON object (<paramref name="data"/>) into a dictionary.
/// </summary>
/// <param name="data">JSON object.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(JObject data)
{
    var dict = data.ToObject<Dictionary<String, Object>>();

    return DeserializeData(dict);
}

/// <summary>
/// Deserialize any elements of the given data dictionary (<paramref name="data"/>) 
///   that are JSON object or JSON arrays into dictionaries or lists respectively.
/// </summary>
/// <param name="data">Data dictionary.</param>
/// <returns>Deserialized dictionary.</returns>
private IDictionary<string, object> DeserializeData(IDictionary<string, object> data)
{
    foreach (var key in data.Keys.ToArray()) 
    {
        var value = data[key];

        if (value is JObject)
            data[key] = DeserializeData(value as JObject);

        if (value is JArray)
            data[key] = DeserializeData(value as JArray);
    }

    return data;
}

/// <summary>
/// Deserialize the given JSON array (<paramref name="data"/>) into a list.
/// </summary>
/// <param name="data">Data dictionary.</param>
/// <returns>Deserialized list.</returns>
private IList<Object> DeserializeData(JArray data)
{
    var list = data.ToObject<List<Object>>();

    for (int i = 0; i < list.Count; i++)
    {
        var value = list[i];

        if (value is JObject)
            list[i] = DeserializeData(value as JObject);

        if (value is JArray)
            list[i] = DeserializeData(value as JArray);
    }

    return list;
}

4

আমি অন্য উত্তরে JSON এ নাল মানগুলির জন্য একটি চেক যুক্ত করেছি

আমার একই সমস্যা ছিল তাই আমি এটি আমার স্ব লিখেছি। এই সমাধানটি অন্যান্য উত্তর থেকে পৃথক করা হয়েছে কারণ এটি একাধিক স্তরে ডিসেরায়ালাইজ করতে পারে।

ডিসরিয়ালাইজড টুডেটরিয়াল ফাংশনটিতে কেবল জসন স্ট্রিং প্রেরণ করুন এটি শক্তভাবে-টাইপযুক্ত Dictionary<string, object>অবজেক্টটি ফিরিয়ে দেবে ।

private Dictionary<string, object> deserializeToDictionary(string jo)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
    var values2 = new Dictionary<string, object>();
    foreach (KeyValuePair<string, object> d in values)
    {
        if (d.Value != null && d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
        {
            values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
        }
        else
        {
            values2.Add(d.Key, d.Value);
        }
    }
    return values2;
}

উদাহরণস্বরূপ: এটি Dictionary<string, object>একটি ফেসবুক জেএসওএন প্রতিক্রিয়াকে প্রত্যাবর্তন করবে ।

private void button1_Click(object sender, EventArgs e)
{
    string responsestring = "{\"id\":\"721055828\",\"name\":\"Dasun Sameera
        Weerasinghe\",\"first_name\":\"Dasun\",\"middle_name\":\"Sameera\",\"last_name\":\"Weerasinghe\",\"username\":\"dasun\",\"gender\":\"male\",\"locale\":\"en_US\",
        hometown: {id: \"108388329191258\", name: \"Moratuwa, Sri Lanka\",}}";
    Dictionary<string, object> values = deserializeToDictionary(responsestring);
}

নোট: হোমটাউন আরও একটি Dictionary<string, object>অবজেক্টের deserialize ।


1
+1 আমি উপরে দাসুনের সাথে যেমন বলেছি। আপনি ঠিক পরীক্ষা করতে পারেন d.Value is JObject। প্রকারগুলি পরীক্ষা করতে আপনাকে প্রতিবিম্বের মধ্য দিয়ে যেতে হবে না। এবং isঅপারেটরের সাথে আপনার নাল পরীক্ষা করার দরকার নেই। যদি বস্তুটি নাল হয় তবে এটি মিথ্যা ফিরিয়ে দেয়।
জর্দান

3

এখানে এই সমস্ত উত্তরগুলি মনে হয় কেবলমাত্র ধরে নেওয়া যায় যে আপনি কোনও ছোট ছোট স্ট্রিংটিকে কোনও বৃহত্তর অবজেক্ট থেকে বের করতে পারবেন ... ম্যাপিংয়ের অভ্যন্তরে কোথাও কোথাও এমন একটি অভিধান সহ একটি বৃহত অবজেক্টকে কেবল অবমূল্যায়ন করতে দেখছেন এবং যারা System.Runtime.Serialization.Jsonডেটা কন্ট্র্যাক্ট সিস্টেম ব্যবহার করছেন , এখানে একটি সমাধান:

Gis.stackexchange.com- এর একটি উত্তরের এই আকর্ষণীয় লিঙ্কটি ছিল । আমাকে এটি সংরক্ষণাগার.অর্গ দিয়ে পুনরুদ্ধার করতে হয়েছিল, তবে এটি একটি চমত্কার নিখুঁত সমাধান: একটি কাস্টম অফার করেIDataContractSurrogate ক্লাস যেখানে আপনি ঠিক নিজের প্রকারের প্রয়োগ করেন। আমি এটি সহজেই প্রসারিত করতে সক্ষম হয়েছি।

যদিও আমি এতে একগুচ্ছ পরিবর্তন করেছি। যেহেতু মূল উত্স আর উপলভ্য নয়, আমি এখানে পুরো ক্লাসটি পোস্ট করব:

using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;

namespace JsonTools
{
    /// <summary>
    /// Allows using Dictionary&lt;String,String&gt; and Dictionary&lt;String,Boolean&gt; types, and any others you'd like to add.
    /// Source: https://web.archive.org/web/20100317222656/my6solutions.com/post/2009/06/30/DataContractSerializer-DataContractJsonSerializer-JavaScriptSerializer-XmlSerializer-for-serialization.aspx
    /// </summary>
    public class JsonSurrogate : IDataContractSurrogate
    {
        /// <summary>
        /// Deserialize an object with added support for the types defined in this class.
        /// </summary>
        /// <typeparam name="T">Contract class</typeparam>
        /// <param name="json">JSON String</param>
        /// <param name="encoding">Text encoding</param>
        /// <returns>The deserialized object of type T</returns>
        public static T Deserialize<T>(String json, Encoding encoding)
        {
            if (encoding == null)
                encoding = new UTF8Encoding(false);
            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(
                typeof(T), new Type[0], int.MaxValue, true, new JsonSurrogate(), false);
            using (MemoryStream stream = new MemoryStream(encoding.GetBytes(json)))
            {
                T result = (T)deserializer.ReadObject(stream);
                return result;
            }
        }

        // make sure all values in this are classes implementing JsonSurrogateObject.
        private static Dictionary<Type, Type> KnownTypes = 
            new Dictionary<Type, Type>()
            {
                {typeof(Dictionary<String, String>), typeof(SSDictionary)},
                {typeof(Dictionary<String, Boolean>), typeof(SBDictionary)}
            };

        #region Implemented surrogate dictionary classes

        [Serializable]
        public class SSDictionary : SurrogateDictionary<String>
        {
            public SSDictionary() : base() {}
            protected SSDictionary (SerializationInfo info, StreamingContext context) : base(info, context) {}
        }
        [Serializable]
        public class SBDictionary : SurrogateDictionary<Boolean>
        {
            public SBDictionary() : base() {}
            protected SBDictionary (SerializationInfo info, StreamingContext context) : base(info, context) {}
        }

        #endregion

        /// <summary>Small interface to easily extract the final value from the object.</summary>
        public interface JsonSurrogateObject
        {
            Object DeserializedObject { get; }
        }

        /// <summary>
        /// Class for deserializing any simple dictionary types with a string as key.
        /// </summary>
        /// <typeparam name="T">Any simple type that will be deserialized correctly.</typeparam>
            [Serializable]
        public abstract class SurrogateDictionary<T> : ISerializable, JsonSurrogateObject
        {
            public Object DeserializedObject { get { return dict; } }
            private Dictionary<String, T> dict;

            public SurrogateDictionary()
            {
                dict = new Dictionary<String, T>();
            }

            // deserialize
            protected SurrogateDictionary(SerializationInfo info, StreamingContext context)
            {
                dict = new Dictionary<String, T>();
                foreach (SerializationEntry entry in info)
                {
                    // This cast will only work for base types, of course.
                    dict.Add(entry.Name, (T)entry.Value);
                }
            }
            // serialize
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                foreach (String key in dict.Keys)
                {
                    info.AddValue(key, dict[key]);
                }
            }

        }

        /// <summary>
            /// Uses the KnownTypes dictionary to get the surrogate classes.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public Type GetDataContractType(Type type)
        {
            Type returnType;
            if (KnownTypes.TryGetValue(type, out returnType))
            {
                return returnType;
            }
            return type;
        }

        public object GetObjectToSerialize(object obj, Type targetType)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        ///     Gets the object out of the surrogate datacontract object. This function is the reason all surrogate objects need to implement the JsonSurrogateObject class.
        /// </summary>
        /// <param name="obj">Result of the deserialization</param>
        /// <param name="targetType">Expected target type of the deserialization</param>
        /// <returns></returns>
        public object GetDeserializedObject(object obj, Type targetType)
        {
            if (obj is JsonSurrogateObject)
            {
                return ((JsonSurrogateObject)obj).DeserializedObject;
            }
            return obj;
        }

        public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
        {
            return null;
        }

        #region not implemented

        public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
        {
            throw new NotImplementedException();
        }

        public object GetCustomDataToExport(Type clrType, Type dataContractType)
        {
            throw new NotImplementedException();
        }

        public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
        {
            throw new NotImplementedException();
        }

        public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

ক্লাসে নতুন সমর্থিত প্রকারগুলি যুক্ত করতে, আপনাকে কেবল আপনার শ্রেণি যুক্ত করতে হবে, এটির জন্য সঠিক নির্মাতারা এবং কার্যাদি প্রদান করতে হবে ( SurrogateDictionaryউদাহরণের জন্য দেখুন ), এটি উত্তরাধিকার সূত্রে নিশ্চিত হয়েছে JsonSurrogateObjectএবং অভিধানে এর ধরণের ম্যাপিং যুক্ত করতে হবে KnownTypes। অন্তর্ভুক্ত Dictionary<String,T>সুরোগেটড অভিধান অভিধান যে কোনও ধরণের যেখানে টি সঠিকভাবে ডিসস্রায়ালাইজ করে এমন কোনও ধরণের ভিত্তি হিসাবে কাজ করতে পারে।

এটিকে কল করা সত্যিই সহজ:

MyObjtype newObj = JsonSurrogate.Deserialize<MyObjtype>(jsonStr, encoding);

নোট করুন যে কোনও কারণে এই জিনিসটির মূল স্ট্রিংগুলিতে স্পেস রয়েছে যা ব্যবহার করতে সমস্যা হয়; তারা কেবল চূড়ান্ত তালিকায় উপস্থিত ছিল না। এটি কেবল জসন স্পক্সের বিরুদ্ধে হতে পারে এবং আমি যে এপিআই ডাকছিলাম তা খারাপভাবে প্রয়োগ করা হয়নি, মনে রাখবেন; আমি জানিনা. যাইহোক, আমি কাঁচা জসন ডেটাতে আন্ডারস্কোরগুলি দিয়ে তাদেরকে রেজেেক্স-প্রতিস্থাপন এবং ডেসারিয়ালাইজেশন পরে অভিধানটি ঠিক করে সমাধান করেছি।


যাইহোক, কিছু অদ্ভুত কারণে মনোর এই জিনিসগুলি চালাতে সমস্যা হয়েছে বলে মনে হয় ...
নাইরেগডস

ভাগ করে নেওয়ার জন্য ধন্যবাদ, দুর্ভাগ্যক্রমে এই সমাধানটি অ-আদিম ধরণের সমর্থন করে না, এবং কাঁচা মান পাওয়ার কোনও উপায় নেই, তাই আপনি নিজেই এটি তৈরি করতে পারেন। যদি আমি আমার কাস্টম প্রকারটি জ্ঞাত টাইপগুলিতে নিবন্ধভুক্ত করি এবং অভিধানে এটি ব্যবহার করি তবে এটি প্রথমে অভিধানটি কল করে, আমি আশা করব যে এটি সবচেয়ে জটিল থেকে আরও দূরবর্তী প্রান্ত থেকে নীচে পার্সিং শুরু করবে start
ইভান লিওনেনকো

ঠিক আছে, প্রশ্ন শুধুমাত্র সম্পর্কে জিজ্ঞাসা করা Dictionary<String,String>। আমি সত্যই কখনও এই সিস্টেমের মাধ্যমে জটিল ধরণের ডিসেরায়ালাইজেশন চেষ্টা করি নি।
নাইয়ারগডস

3

উপরোক্ত মন্তব্যের ভিত্তিতে চেষ্টা করুনJsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)

var json = @"{""key1"":1,""key2"":""value2"", ""object1"":{""property1"":""value1"",""property2"":[2,3,4,5,6,7]}}";
var parsedObject = JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json);

এমনকি জটিল বস্তু এবং তালিকার জন্যও কাজ করে বলে মনে হচ্ছে।


1

আমি কেবল এটি রেস্টশর্পে প্রয়োগ করেছিএই পোস্টটি আমার জন্য সহায়ক ছিল।

লিঙ্কে কোড ছাড়াও, এখানে আমার কোড। আমি এখন Dictionaryএমন কিছু করি যখন আমি ফলাফল পেতে পারি:

var jsonClient = new RestClient(url.Host);
jsonClient.AddHandler("application/json", new DynamicJsonDeserializer());
var jsonRequest = new RestRequest(url.Query, Method.GET);
Dictionary<string, dynamic> response = jsonClient.Execute<JObject>(jsonRequest).Data.ToObject<Dictionary<string, dynamic>>();

আপনি যে JSON এর প্রত্যাশা করছেন সে সম্পর্কে সচেতন হন - আমার ক্ষেত্রে, আমি বেশ কয়েকটি বৈশিষ্ট্য সহ একটি একক বস্তু পুনরুদ্ধার করছি। সংযুক্ত লিঙ্কে, লেখক একটি তালিকা পুনরুদ্ধার করছেন।


1

আমার পদ্ধতির মধ্যে সরাসরি JObject বা ExpandObject ছাড়াই আইডোরিয়াসে ডিসরিয়ালাইজ করা হয়। কোডটি রূপান্তরকারী ব্যবহার করে, যা মূলত JSON.NET সোর্সকোডে পাওয়া ExpandoObjectConverter শ্রেণি থেকে অনুলিপি করা হয়েছে, তবে ExpandoObject এর পরিবর্তে ID অভিধান ব্যবহার করে।

ব্যবহার:

var settings = new JsonSerializerSettings()
{
    Converters = { new DictionaryConverter() },
};
var result = JsonConvert.DeserializeObject<IDictionary<string, object>>(json, settings);

কোড:

// based on ExpandoObjectConverter, but using arrays instead of IList, to behave similar to System.Web.Script.Serialization.JavaScriptSerializer
public class DictionaryConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return ReadValue(reader);
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(IDictionary<string, object>));
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    private object ReadValue(JsonReader reader)
    {
        while (reader.TokenType == JsonToken.Comment)
        {
            if (!reader.Read())
                throw JsonSerializationExceptionCreate(reader, "Unexpected end when reading IDictionary<string, object>.");
        }

        switch (reader.TokenType)
        {
            case JsonToken.StartObject:
                return ReadObject(reader);
            case JsonToken.StartArray:
                return ReadList(reader);
            default:
                if (IsPrimitiveToken(reader.TokenType))
                    return reader.Value;

                throw JsonSerializationExceptionCreate(reader, string.Format(CultureInfo.InvariantCulture, "Unexpected token when converting IDictionary<string, object>: {0}", reader.TokenType));
        }
    }

    private object ReadList(JsonReader reader)
    {
        List<object> list = new List<object>();

        while (reader.Read())
        {
            switch (reader.TokenType)
            {
                case JsonToken.Comment:
                    break;
                default:
                    object v = ReadValue(reader);

                    list.Add(v);
                    break;
                case JsonToken.EndArray:
                    return list;
            }
        }

        throw JsonSerializationExceptionCreate(reader, "Unexpected end when reading IDictionary<string, object>.");
    }

    private object ReadObject(JsonReader reader)
    {
        IDictionary<string, object> dictionary = new Dictionary<string, object>();
        while (reader.Read())
        {
            switch (reader.TokenType)
            {
                case JsonToken.PropertyName:
                    string propertyName = reader.Value.ToString();

                    if (!reader.Read())
                        throw JsonSerializationExceptionCreate(reader, "Unexpected end when reading IDictionary<string, object>.");

                    object v = ReadValue(reader);

                    dictionary[propertyName] = v;
                    break;
                case JsonToken.Comment:
                    break;
                case JsonToken.EndObject:
                    return dictionary;
            }
        }

        throw JsonSerializationExceptionCreate(reader, "Unexpected end when reading IDictionary<string, object>.");
    }

    //based on internal Newtonsoft.Json.JsonReader.IsPrimitiveToken
    internal static bool IsPrimitiveToken(JsonToken token)
    {
        switch (token)
        {
            case JsonToken.Integer:
            case JsonToken.Float:
            case JsonToken.String:
            case JsonToken.Boolean:
            case JsonToken.Undefined:
            case JsonToken.Null:
            case JsonToken.Date:
            case JsonToken.Bytes:
                return true;
            default:
                return false;
        }
    }

    // based on internal Newtonsoft.Json.JsonSerializationException.Create
    private static JsonSerializationException JsonSerializationExceptionCreate(JsonReader reader, string message, Exception ex = null)
    {
        return JsonSerializationExceptionCreate(reader as IJsonLineInfo, reader.Path, message, ex);
    }

    // based on internal Newtonsoft.Json.JsonSerializationException.Create
    private static JsonSerializationException JsonSerializationExceptionCreate(IJsonLineInfo lineInfo, string path, string message, Exception ex)
    {
        message = JsonPositionFormatMessage(lineInfo, path, message);

        return new JsonSerializationException(message, ex);
    }

    // based on internal Newtonsoft.Json.JsonPosition.FormatMessage
    internal static string JsonPositionFormatMessage(IJsonLineInfo lineInfo, string path, string message)
    {
        if (!message.EndsWith(Environment.NewLine))
        {
            message = message.Trim();

            if (!message.EndsWith(".", StringComparison.Ordinal))
                message += ".";

            message += " ";
        }

        message += string.Format(CultureInfo.InvariantCulture, "Path '{0}'", path);

        if (lineInfo != null && lineInfo.HasLineInfo())
            message += string.Format(CultureInfo.InvariantCulture, ", line {0}, position {1}", lineInfo.LineNumber, lineInfo.LinePosition);

        message += ".";

        return message;
    }
}

1

আপনি টিনি-জেএসএন ব্যবহার করতে পারেন

string json = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
IDictionary<string, string> dict = Tiny.Json.Decode<Dictionary<string, string>>(json);

1

গেমটিটি কিছুটা দেরি করে নিল, তবে উপরের সমাধানগুলির কোনওটিই আমাকে একটি খাঁটি এবং সাধারণ। নেট, দিকনির্দেশের দিকে ইশারা করেছিল, কোন জাসন নেটনের সমাধান নয়। সুতরাং এখানে এটি খুব সহজ হয়ে শেষ। স্ট্যান্ডার্ড .NET জেসন সিরিয়ালাইজেশন দিয়ে এটি কীভাবে করা হয় তার সম্পূর্ণ চলমান উদাহরণের নীচে, উদাহরণটিতে মূল অবজেক্টে এবং শিশু অবজেক্টগুলিতে অভিধান রয়েছে।

সোনালি বুলেটটি এই বিড়ালটি, সিরিয়ালায়কের দ্বিতীয় প্যারামিটার হিসাবে সেটিংসটিকে বিশ্লেষণ করুন:

DataContractJsonSerializerSettings settings =
                       new DataContractJsonSerializerSettings();
                    settings.UseSimpleDictionaryFormat = true;

সম্পূর্ণ কোড নীচে:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

    namespace Kipon.dk
    {
        public class JsonTest
        {
            public const string EXAMPLE = @"{
                ""id"": ""some id"",
                ""children"": {
                ""f1"": {
                    ""name"": ""name 1"",
                    ""subs"": {
                    ""1"": { ""name"": ""first sub"" },
                    ""2"": { ""name"": ""second sub"" }
                    }
                },
                ""f2"": {
                    ""name"": ""name 2"",
                    ""subs"": {
                    ""37"": { ""name"":  ""is 37 in key""}
                    }
                }
                }
            }
            ";

            [DataContract]
            public class Root
            {
                [DataMember(Name ="id")]
                public string Id { get; set; }

                [DataMember(Name = "children")]
                public Dictionary<string,Child> Children { get; set; }
            }

            [DataContract]
            public class Child
            {
                [DataMember(Name = "name")]
                public string Name { get; set; }

                [DataMember(Name = "subs")]
                public Dictionary<int, Sub> Subs { get; set; }
            }

            [DataContract]
            public class Sub
            {
                [DataMember(Name = "name")]
                public string Name { get; set; }
            }

            public static void Test()
            {
                var array = System.Text.Encoding.UTF8.GetBytes(EXAMPLE);
                using (var mem = new System.IO.MemoryStream(array))
                {
                    mem.Seek(0, System.IO.SeekOrigin.Begin);
                    DataContractJsonSerializerSettings settings =
                       new DataContractJsonSerializerSettings();
                    settings.UseSimpleDictionaryFormat = true;

                    var ser = new DataContractJsonSerializer(typeof(Root), settings);
                    var data = (Root)ser.ReadObject(mem);
                    Console.WriteLine(data.Id);
                    foreach (var childKey in data.Children.Keys)
                    {
                        var child = data.Children[childKey];
                        Console.WriteLine(" Child: " + childKey + " " + child.Name);
                        foreach (var subKey in child.Subs.Keys)
                        {
                            var sub = child.Subs[subKey];
                            Console.WriteLine("   Sub: " + subKey + " " + sub.Name);
                        }
                    }
                }
            }
        }
    }

0

বিরক্তিকরভাবে যথেষ্ট, আপনি যদি ডিফল্ট মডেল বাইন্ডারগুলি ব্যবহার করতে চান তবে মনে হয় আপনাকে একটি ফর্ম POST এর মতো সংখ্যার সূচক মানগুলি ব্যবহার করতে হবে।

এই নিবন্ধটি থেকে নীচের অংশটি দেখুন http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :

যদিও এটি কিছুটা বিপরীতমুখী, JSON অনুরোধগুলির একই প্রয়োজনীয়তা রয়েছে — তাদেরও অবশ্যই নামকরণ সিনট্যাক্স পোস্টের ফর্মটি মেনে চলতে হবে। উদাহরণস্বরূপ, আগের ইউনিটপ্রাইস সংগ্রহের জন্য জেএসএন পে-লোড নিন। এই ডেটাটির জন্য খাঁটি JSON অ্যারে সিনট্যাক্সটি উপস্থাপিত হবে:

[ 
  { "Code": "USD", "Amount": 100.00 },
  { "Code": "EUR", "Amount": 73.64 }
]

তবে, ডিফল্ট মান সরবরাহকারী এবং মডেল বাইন্ডারগুলির জন্য JSON ফর্ম পোস্ট হিসাবে ডেটা উপস্থাপন করা প্রয়োজন:

{
  "UnitPrice[0].Code": "USD",
  "UnitPrice[0].Amount": 100.00,

  "UnitPrice[1].Code": "EUR",
  "UnitPrice[1].Amount": 73.64
}

জটিল অবজেক্ট সংগ্রহের দৃশ্যপট সম্ভবত বিকাশকারীদের মধ্যে চালিত সবচেয়ে ব্যাপক সমস্যাযুক্ত পরিস্থিতিগুলির মধ্যে একটি কারণ সিনট্যাক্স অগত্যা সমস্ত বিকাশকারীদের কাছে স্পষ্ট হয় না। যাইহোক, একবার আপনি জটিল সংগ্রহ পোস্ট করার জন্য তুলনামূলকভাবে সহজ বাক্য গঠন শিখলে, এই পরিস্থিতিগুলি মোকাবেলা করা আরও সহজ হয়ে যায়।


0

আমি এটি System.Runtime.Serialization.Jsonনেট। 4.5 এর অংশ হিসাবে ব্যবহার করার পরামর্শ দেব suggest

[DataContract]
public class Foo
{
   [DataMember(Name = "data")]
   public Dictionary<string,string> Data { get; set; }
}

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

var serializer = new DataContractJsonSerializer(typeof(List<Foo>));
var jsonParams = @"{""data"": [{""Key"":""foo"",""Value"":""bar""}] }";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonParams));

var obj = serializer.ReadObject(stream);
Console.WriteLine(obj);

সিরিয়ালাইজার কোথায় সংজ্ঞায়িত হয়?
বিনিল্যান্ড

.. এবং একটি বিভাগ 3 মেজারমোডেল কী? গুগলে কোনও হিট নেই।
বিনিল্যান্ড

1
এটি কেবলমাত্র আমার মডেল ক্লাস যা আমি আমার প্রকল্পের জন্য সিরিয়াল করছি। এটি فو ফু ক্লাস হওয়ার কথা, তবে আমি প্রোডাকশন কোড থেকে পুরো বিভাগটি আবার সরিয়ে দিয়েছি। আমার নিজের ফু ক্লাসের মতো আপনার নিজের তৈরি করা উচিত। এটিকে সহজ করার জন্য আমি এটির নাম বদলে রেখেছি। এটি কেবলমাত্র সম্পত্তি এবং ক্ষেত্রগুলির একটি শ্রেণি যা আপনি জসন এবং পিছনে সিরিয়ালাইজড করতে চান।
ড্যান সিশার্পস্টার

1
@ ড্যানশার্পস্টার আপনার উইন্ডোজ ফোন ৮.১ সিলভারলাইটে আপনার কোডটির একটি অনুলিপি-অতীতের সাথে পেয়েছি: System 'সিস্টেম.সিকিউরিটি.সিকিউরিটি এক্সসেপশন' টাইপের একটি ব্যতিক্রম সিস্টেম.সোর্সোমোডেল.ওয়েব.নি.ডিএল-তে এসেছিল তবে ব্যবহারকারীর দ্বারা পরিচালিত হয়নি কোড অতিরিক্ত তথ্য: ডেটা কন্ট্রাক্ট টাইপ 'মাই অ্যাপ.ফু' এর ডিসরিয়ালাইজ করা যাবে না কারণ সদস্য 'ডেটা' পাবলিক নয়। সদস্যটিকে পাবলিক করা এই ত্রুটিটি ঠিক করবে। বিকল্পভাবে, আপনি এটিকে অভ্যন্তরীণ করতে পারেন এবং অভ্যন্তরীণ সদস্যদের সিরিয়ালাইজেশন সক্ষম করতে আপনার সমাবেশে ইন্টার্নিভিসিবলটিওঅ্যাট্রিবিউট অ্যাট্রিবিউটটি ব্যবহার করতে পারেন
Curur

1
@ ড্যানশার্পস্টার এবং প্রোপার্টি ডেটাটিকে সদস্য হিসাবে পরিবর্তন করার সময় (না পেয়ে; সেট করা;) পেয়েছি, আমি পেয়েছি: 'সিস্টেম.আরগমেন্টএক্সেপশন' টাইপের প্রথম সুযোগ ব্যতীত সিস্টেম.সেবারমোডেল.ওয়েব.ইন.ডিএল অতিরিক্ত তথ্য: অবজেক্টের অবজেক্ট টাইপ 'সিস্টেম.অজেক্ট' টাইপ করে 'সিস্টেম.কলেশনস.জেনারিক.ডায়ার্নিশ`2 [সিস্টেম.স্ট্রিং, সিস্টেম.স্ট্রিং]' তে রূপান্তর করা যাবে না।
Cœur

0

যে কেউ এর থেকে কিছু মূল্য পুনরুদ্ধারের জন্য জেএসওনকে অভিধানে রূপান্তর করতে চেষ্টা করছেন For ব্যবহার করার একটি সহজ উপায় আছেNewtongsoft.JSON

using Newtonsoft.Json.Linq
...

JObject o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

string cpu = (string)o["CPU"];
// Intel

string firstDrive = (string)o["Drives"][0];
// DVD read/writer

IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.