JSON স্ট্রিং সি # অবজেক্টে রূপান্তর করুন


183

জেএসএন স্ট্রিংকে সি # তে কোনও বস্তুতে রূপান্তর করার চেষ্টা করা হচ্ছে। সত্যিই সাধারণ পরীক্ষার কেস ব্যবহার করে:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

সমস্যাটি হ'ল রুট_লিস্ট কখনই সেট হয় না; এটি একটি অপরিবর্তিত বস্তু। কোন ধারনা?


1
@ গ্রেগ: আমি আসলে JavaScriptSerializerওভার এমএসের সংস্করণটি সুপারিশ করি কারণ এটি ডাব্লুসিএফের কাস্টম জেএসওএন ফর্ম্যাটিং ছাড়া অন্য কিছু গ্রহণ করবে না (যেমন তারিখের মতো দেখতে তারিখের ক্ষেত্রগুলি যা তারিখের মতো দেখায় না) (খারাপভাবে ব্যর্থ হয়)
ব্র্যাড ক্রিস্টি

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

আপনি কোথায় জাভাস্ক্রিপ্টসিরাইজার পাবেন? এটি আমার সি # .NET 3.5 প্রকল্পে অচেনা।
বি ক্লে শ্যানন

1
@B। ক্লে শ্যানন এটি আমার জন্য এটা সমাধান করা stackoverflow.com/questions/7000811/...
Fuzzybear

উত্তর:


127

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

এই ক্ষেত্রে:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

তারপরে আপনার deserialization কোডটি হবে:

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

আরও টিউটোরিয়ালটিতে এই তথ্যটি পাওয়া যাবে: http://www.codeproject.com/Tips/79435/Desrialize-JSON-with-Csharp.aspx


1
তবে নির্দেশিত নিবন্ধে অটোপ্রোপার্টি ব্যবহার করা হয়। এটিও উল্লেখ করার মতো।
ইভান কোচুরকিন

11
দুঃখিত, কিন্তু এই কোড নমুনা কাজ করে না। DeserializeObject একটি ব্যতিক্রম দেয়। Varways_list = সিরিয়ালাইজারটি ব্যবহার করুন ese পরিবর্তে. এছাড়াও, আপনার / সেটটেষ্ট () এবং স্ট্রিং পরীক্ষা দরকার নেই, সর্বজনীন হওয়া উচিত। এটি সি # এর চেয়ে জাবার মতো দেখাচ্ছে।
dvallejo

ড্যান ভ্যালিজো যেমন উল্লেখ করেছেন, এটি একটি ভুল সমাধান। সর্বোপরি, সেটটেষ্ট (স্ট্রিং পরীক্ষা) ফিরছে না, যা সংকলন ত্রুটিও।
পাইম

1
এটিও ব্যবহার করতে পারেন: json_serializer.Desrialize <টেস্ট> ("{\" পরীক্ষা \ ": some" কিছু ডেটা; "}"); // (টেস্ট) এর পরিবর্তে json_serializer .....
বাশার আবু শামা

1
আপনি যদি আপনার শ্রেণি অবজেক্টের ফর্ম্যাট সম্পর্কে অনিশ্চিত হন তবে এই লিঙ্কটি ব্যবহার করে দেখুন । এটি আপনার জসন স্ট্রিংটিকে সঠিক ক্লাসে অনুবাদ করে। আমাকে এক টন সময় বাঁচিয়েছে!
jade290

230

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

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

Tআপনার জেএসওএন স্ট্রিংয়ের সাথে মেলে এমন আপনার অবজেক্টের ধরণটি কোথায় ।


3
এটি এত সহজ এবং আমি কীভাবে এটি করব তা নিয়ে এতক্ষণ ভাবছিলাম।
মারাকুজা-রস

58

আপনি সম্ভবত রুট_লিস্টকে কোনও objectপ্রকার হিসাবে ঘোষণা করতে চান না । এটিতে একটি সর্বশেষ সম্পত্তি নেই, সুতরাং আপনি সত্যিই কোনও ভাল জিনিস ফিরে পাবেন না। এটি সেই জায়গাগুলির মধ্যে একটি যেখানে আপনি কোনও শ্রেণি বা কাঠামো সংজ্ঞায়িত করা বা গতিশীল কীওয়ার্ডটি ব্যবহার করা ভাল।

আপনি যদি এই কোডটি আপনার যেমনটি করেন ঠিক তেমন কাজ করতে চান তবে আপনাকে জানতে হবে DeserializeObject দ্বারা প্রত্যাবর্তিত বস্তুটি স্ট্রিং, অবজেক্টের জেনেরিক অভিধান dictionary সেভাবে করার জন্য এখানে কোডটি দেওয়া হয়েছে:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

আপনি যদি গতিশীল কীওয়ার্ডটি ব্যবহার করতে চান তবে আপনি এখানে কীভাবে পড়তে পারেন

যদি আপনি কোনও শ্রেণি বা কাঠামো ঘোষণা করেন তবে আপনি ডেসরিয়ালাইজ অবজেক্টের পরিবর্তে ডেসরিয়ালাইজ করতে পারেন:

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}

করছেন: json_serializer = নতুন জাভাস্ক্রিপ্টসরিয়ালাইজার (); অবজেক্ট রুট_লিস্ট = (আইডিয়োরিজ <স্ট্রিং, অবজেক্ট>) জসন_সিরিয়ালাইজার.ডিজরিয়ালাইজ অবজেক্ট ("{\" পরীক্ষা \ ": \" এখানে কিছু ডেটা; "}"); এখনও 'রুট_লিস্ট' পাওয়া বর্তমান প্রসঙ্গে নেই।
জাস্টিন

1
ব্যবহার করবেন না object routes_listvarনিজেকে ব্যবহার করুন বা স্পষ্টভাবে পুনরাবৃত্তি করুন এবং রুট_লিস্টকে আইডি অভিধান হিসাবে <স্ট্রিং, অবজেক্ট> হিসাবে ঘোষণা করুন।
mattmc3

31

জাভাস্ক্রিপ্টসিরাইজারের সাথে ডায়নামিক অবজেক্ট ব্যবহার করা।

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"

19

জাভা স্ক্রিপ্ট সিরিয়ালাইজের চেয়ে নিউটনসফট দ্রুত faster ... এটি নিউটসনফট নুগেট প্যাকেজের উপর নির্ভর করে যা জনপ্রিয় এবং ডিফল্ট সিরিয়ালাইজারের চেয়ে ভাল।

একটি লাইন কোড সমাধান।

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);

15

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

এটি পরীক্ষা করার জন্য নীচের কোডটি লিনকপ্যাডে চালানো যেতে পারে:

  • লিনকপ্যাডে আপনার স্ক্রিপ্ট ট্যাবে ডান ক্লিক করে এবং "কোয়েরি প্রোপার্টি" নির্বাচন করে
  • "অতিরিক্ত রেফারেন্স" এ "সিস্টেম.ওয়েব.এক্সটেনশন.ডিল" উল্লেখ করা হচ্ছে
  • "System.Web.Script.Serialization" এর একটি "অতিরিক্ত নেমস্পেস আমদানি" যুক্ত করা হচ্ছে।

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

void Main()
{
  string json = @"
  {
    'glossary': 
    {
      'title': 'example glossary',
        'GlossDiv': 
        {
          'title': 'S',
          'GlossList': 
          {
            'GlossEntry': 
            {
              'ID': 'SGML',
              'ItemNumber': 2,          
              'SortAs': 'SGML',
              'GlossTerm': 'Standard Generalized Markup Language',
              'Acronym': 'SGML',
              'Abbrev': 'ISO 8879:1986',
              'GlossDef': 
              {
                'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                'GlossSeeAlso': ['GML', 'XML']
              },
              'GlossSee': 'markup'
            }
          }
        }
    }
  }

  ";

  var d = new JsonDeserializer(json);
  d.GetString("glossary.title").Dump();
  d.GetString("glossary.GlossDiv.title").Dump();  
  d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
  d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
  d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
}


// Define other methods and classes here

public class JsonDeserializer
{
  private IDictionary<string, object> jsonData { get; set; }

  public JsonDeserializer(string json)
  {
    var json_serializer = new JavaScriptSerializer();

    jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
  }

  public string GetString(string path)
  {
    return (string) GetObject(path);
  }

  public int? GetInt(string path)
  {
    int? result = null;

    object o = GetObject(path);
    if (o == null)
    {
      return result;
    }

    if (o is string)
    {
      result = Int32.Parse((string)o);
    }
    else
    {
      result = (Int32) o;
    }

    return result;
  }

  public object GetObject(string path)
  {
    object result = null;

    var curr = jsonData;
    var paths = path.Split('.');
    var pathCount = paths.Count();

    try
    {
      for (int i = 0; i < pathCount; i++)
      {
        var key = paths[i];
        if (i == (pathCount - 1))
        {
          result = curr[key];
        }
        else
        {
          curr = (IDictionary<string, object>)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}

14

আপনি নিউটনসফট.জসন লাইব্রেরিটি ব্যবহার করে সহজেই আপনার প্রয়োজনীয়তা অর্জন করতে পারেন। আমি নীচে একটি উদাহরণ লিখছি এটি একবার দেখুন।

আপনি যে ধরণের অবজেক্টটি পেয়েছেন তার শ্রেণি:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

}

কোড:

static void Main(string[] args)
{

      string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";

      User user = JsonConvert.DeserializeObject<User>(json);

      Console.ReadKey();
}

আপনার জসনকে পার্স করার এটি একটি খুব সহজ উপায়।


11

যেমন ট্রিপলিটড্যাড

var result = JsonConvert.DeserializeObject<T>(json);

তবে আপনি যদি কোনও অতিরিক্ত অবজেক্ট তৈরি করতে না চান তবে আপনি এটির Dictionaryপরিবর্তে এটি তৈরি করতে পারেন

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

এটি দরকারী, এটির পরে আপনি url.Action (ক্রিয়া, নিয়ামক, ফলাফল)
লাপেনকভ ভ্লাদিমির

8

আপনার প্রকল্পের রেফারেন্সে এই ডিডিএল যুক্ত করুন : System.Web.Extensions.dll

এই নেমস্পেসটি ব্যবহার করুন : System.Web.Script.Serialization ব্যবহার করে;

public class IdName
{
    public int Id { get; set; }
    public string Name { get; set; }
}


   string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
   var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);

   string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
   var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);

6

আপনার JSON কপি করুন এবং উপর পাঠ্যবাক্স এ পেস্ট করুন json2csharp এবং বাটন জেনারেট করুন এ ক্লিক করুন।

সিএস ফাইলটি নীচের মতো ব্যবহার করে একটি সিএস ক্লাস তৈরি করা হবে

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObjectউত্পন্ন সিএস ফাইলের নাম কোথায় ;


4

এই পদক্ষেপগুলি আধা-স্বয়ংক্রিয় করার আর একটি দ্রুত এবং সহজ উপায় হ'ল:

  1. আপনি যে JSON কে পার্স করতে চান তা নিন এবং এটি এখানে আটকান: https://app.quicktype.io/ । ড্রপ ডাউনতে ভাষা # সি তে পরিবর্তন করুন।
  2. উপরের বামে নামটি আপনার শ্রেণীর নামটিতে আপডেট করুন, এটি "স্বাগতম" এর ডিফল্ট।
  3. ভিজ্যুয়াল স্টুডিওতে ওয়েবসাইট -> প্যাকেজগুলি পরিচালনা করুন এবং নিউটোনসফ্ট থেকে জসন.নেট যুক্ত করতে নিউগেট ব্যবহার করুন।
  4. app.quicktype.io নিউটোনসফ্টের উপর ভিত্তি করে ক্রমিক পদ্ধতি তৈরি করেছে। বিকল্পভাবে, আপনি এখন কোডগুলি ব্যবহার করতে পারেন:

    ওয়েবক্লিয়েন্ট ক্লায়েন্ট = নতুন ওয়েবক্লিয়েন্ট ();

    স্ট্রিং মাইজেএসএন = ক্লায়েন্ট।ডাউনলোডস্ট্রিং (" https://URL_FOR_JSON.com/JSON_STUFF ");

    var মাইক্রাস = নিউটোনসফট.জসন.জসন কনভার্ট.ডিজারিয়ালাইজ অবজেক্ট (মাইজেএসএন);


লিঙ্কটি আর বৈধ নয়
মাইলস জে

ধন্যবাদ মাইলেস জে, আমি একটি নতুন সাইটে আপডেট করেছি যা ভাল কাজ করে বলে মনে হচ্ছে।
জেসন হিচিংস

0

একটি JSON স্ট্রিংকে সি # তে কোনও বস্তুতে রূপান্তর করুন। পরীক্ষার ক্ষেত্রে নীচে ব্যবহার করা .. এটি আমার জন্য কাজ করেছে। এখানে " MenuInfo " হ'ল আমার সি # শ্রেণি অবজেক্ট।

JsonTextReader reader = null;
try
{
    WebClient webClient = new WebClient();
    JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
    reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
    reader.SupportMultipleContent = true;
}
catch(Exception)
{}

JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);

0

প্রথমে আপনাকে লাইব্রেরি অন্তর্ভুক্ত করতে হবে:

using System.Runtime.Serialization.Json;

DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";

using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
    BlogSite b = (BlogSite)desc.ReadObject(ms);
    Console.WriteLine(b.Name);
    Console.WriteLine(b.Description);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.