JSON स्ट्रिंग को C # ऑब्जेक्ट में बदलें


183

JSON स्ट्रिंग को C # में ऑब्जेक्ट में बदलने की कोशिश करना। वास्तव में सरल परीक्षण मामले का उपयोग करना:

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

समस्या यह है कि path_list कभी सेट नहीं होती है; यह एक अपरिभाषित वस्तु है। कोई विचार?


1
@Greg: मैं वास्तव में JavaScriptSerializerMS के संस्करण की सिफारिश करता हूं क्योंकि यह कुछ और स्वीकार नहीं करेगा, लेकिन WCF के कस्टम JSON प्रारूपण (उदाहरण के लिए दिनांक फ़ील्ड जो दिनांक की तरह दिखते हैं लेकिन DATE में घिरे नहीं हैं () बुरी तरह से विफल हैं)
ब्रैड क्रिस्टी

इसके अलावा, इस पार्सिंग JSON ऑब्जेक्ट्स को JavascriptSerializer के साथ .NET आलेख में देखें, जो वास्तव में एक महान ट्यूटोरियल है।
स्कटमोई

आपको JavaScriptSerializer कहाँ मिल रहा है? यह मेरी C # .NET 3.5 परियोजना में अपरिचित है।
बी क्ले शैनन

1
@B। क्ले शैनन यह मेरे लिए यह हल stackoverflow.com/questions/7000811/...
Fuzzybear

जवाबों:


127

ऐसा लगता है कि आप एक कच्ची वस्तु के लिए deserialize करने की कोशिश कर रहे हैं। आप एक वर्ग बना सकते हैं जो उस वस्तु का प्रतिनिधित्व करता है जिसे आप परिवर्तित कर रहे हैं। यह उन मामलों में सबसे उपयोगी होगा जहां आप बड़ी वस्तुओं या JSON स्ट्रिंग्स के साथ काम कर रहे हैं।

उदाहरण के लिए:

  class Test {

      String test; 

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

  }

फिर आपका डीरियलाइज़ेशन कोड होगा:

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

इस ट्यूटोरियल में अधिक जानकारी प्राप्त की जा सकती है: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx


1
लेकिन इंगित लेख में ऑटोप्रोपरेटी का उपयोग किया जाता है। यह भी ध्यान देने योग्य है।
इवान कोचरिन

11
क्षमा करें, लेकिन यह कोड नमूना काम नहीं करता है। DeserializeObject एक अपवाद देता है। Var path_list = serializer.eserialize <Test> ("{\" test \ ": \" कुछ डेटा \ "}") का उपयोग करें; बजाय। इसके अलावा, आपको सार्वजनिक / सेट टेस्ट () और स्ट्रिंग परीक्षण की आवश्यकता नहीं है। यह सी # की तुलना में जावा की तरह अधिक दिखता है।
दवलीनो

जैसा कि डैन वैलेजो ने उल्लेख किया है, यह एक गलत समाधान है। सब के बाद, सेटटेस्ट (स्ट्रिंग परीक्षण) वापस नहीं आ रहा है, जो संकलन त्रुटि भी है।
पेम

1
यह भी उपयोग कर सकते हैं: json_serializer.Deserialize <Test> ("{\" test \ ": \" कुछ डेटा \ "}"); // (टेस्ट) के बजाय json_serializer .....
बशर अबू शमा

1
यदि आप अपने वर्ग ऑब्जेक्ट के लिए प्रारूप के अनिश्चित हैं, तो इस लिंक को आज़माएं । यह आपके Json string को सही वर्गों में अनुवादित करता है। मुझे एक टन समय बचा लिया!
jade290

231

या, आप न्यूटाउनसॉफ्ट.जॉन लाइब्रेरी का उपयोग इस प्रकार कर सकते हैं:

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

Tआपका ऑब्जेक्ट प्रकार कहां है जो आपके JSON स्ट्रिंग से मेल खाता है।


3
यह बहुत आसान है और मैंने सोचा कि यह कैसे करना है।
मारकुजा-रस

58

आप शायद मार्गों को केवल एक objectप्रकार के रूप में घोषित नहीं करना चाहते । यह एक .test संपत्ति नहीं है, तो आप वास्तव में एक अच्छी वस्तु वापस पाने के लिए नहीं जा रहे हैं। यह उन जगहों में से एक है, जहाँ आप क्लास या स्ट्रक्चर को परिभाषित करने से बेहतर होंगे या डायनामिक कीवर्ड का उपयोग कर सकते हैं।

यदि आप वास्तव में चाहते हैं कि यह कोड आपके पास काम करे, तो आपको यह जानना होगा कि DeserializeObject द्वारा दी गई वस्तु स्ट्रिंग, ऑब्जेक्ट का एक सामान्य शब्दकोष है। इस तरह से करने के लिए यहाँ कोड है:

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

यदि आप डायनामिक कीवर्ड का उपयोग करना चाहते हैं, तो आप यहां पढ़ सकते हैं

यदि आप एक वर्ग या संरचना की घोषणा करते हैं, तो आप DeserializeObject की जगह Deserialize को कॉल कर सकते हैं:

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 = new JavaScriptSerializer (); ऑब्जेक्ट path_list = (IDEDIA <string, object>) json_serializer.DeserializeObject ("{\" test \ ": \" कुछ डेटा यहाँ \ "}"); अभी भी 'पाथ्स_लिस्ट' मिलना मौजूदा संदर्भ में मौजूद नहीं है।
जस्टिन

1
उपयोग न करें object routes_list। उपयोग करें varया स्पष्ट रूप से अपने आप को दोहराएं और मार्गों_सूची को एक IDEDIA <स्ट्रिंग, ऑब्जेक्ट> के रूप में घोषित करें।
मटका 3

31

जावास्क्रिप्ट ऑब्जेक्ट के साथ डायनामिक ऑब्जेक्ट का उपयोग करना।

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

//test Result = "some data"

19

Newtonsoft java script serializer की तुलना में तेज़ है। ... यह एक न्यूटनसॉफ्ट नूगेट पैकेज पर निर्भर करता है, जो डिफ़ॉल्ट धारावाहिक से लोकप्रिय और बेहतर है।

एक लाइन कोड समाधान।

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

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

15

यहाँ एक सरल वर्ग मैं विभिन्न पदों से एक साथ पत्थर है .... यह 15 मिनट के लिए परीक्षण किया गया है, लेकिन लगता है मेरी प्रयोजनों के लिए काम करने के लिए। यह JavascriptSerializerकाम करने के लिए उपयोग करता है, जिसे इस पोस्ट में विस्तृत जानकारी का उपयोग करके आपके ऐप में संदर्भित किया जा सकता है ।

नीचे दिए गए कोड को इसके परीक्षण के लिए LinqPad में चलाया जा सकता है:

  • LinqPad में अपनी स्क्रिप्ट टैब पर राइट क्लिक करें, और "क्वेरी गुण" चुनें
  • "अतिरिक्त संदर्भ" में "System.Web.Extensions.dll" का संदर्भ लेना
  • "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();
}

यह आपके json को पार्स करने का बहुत सरल तरीका है।


11

जैसा कि tripletdad99 ने कहा

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

लेकिन अगर आप एक अतिरिक्त ऑब्जेक्ट नहीं बनाना चाहते हैं तो आप Dictionaryइसके बजाय इसे बना सकते हैं

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

यह उपयोगी है, मट्ठा तो आप Url.Action (कार्रवाई, नियंत्रक, परिणाम) के लिए मापदंडों को पार करते हैं
लापेनकोव व्लादिमीर

8

इस ddl को अपनी परियोजना के संदर्भ में जोड़ें: 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 पर टेक्स्टबॉक्स में पेस्ट करें और Generate बटन पर क्लिक करें।

एक सीएस वर्ग उत्पन्न किया जाएगा जो नीचे के रूप में उस सीएस फ़ाइल का उपयोग करेगा

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObjectउत्पन्न सीएस फ़ाइल का नाम कहां है ;


4

इन चरणों को स्वचालित करने का एक और तेज़ और आसान तरीका है:

  1. आप जिस JSON को पार्स और पेस्ट करना चाहते हैं, उसे यहां ले जाएं : https://app.quicktype.io/ । ड्रॉप डाउन में भाषा को C # में बदलें।
  2. अपने वर्ग के नाम के ऊपर बाईं ओर नाम अपडेट करें, यह "वेलकम" में डिफॉल्ट करता है।
  3. दृश्य स्टूडियो में वेबसाइट पर जाएँ -> संकुल प्रबंधित करें और न्यूटनसॉफ्ट से Json.Net को जोड़ने के लिए NuGet का उपयोग करें।
  4. app.quicktype.io ने न्यूटंसॉफ्ट पर आधारित क्रमबद्ध तरीके उत्पन्न किए। वैकल्पिक रूप से, अब आप कोड का उपयोग कर सकते हैं जैसे:

    WebClient ग्राहक = नया WebClient ();

    string myJSON = client.DownloadString (" https://URL_FOR_JSON.com/JSON_STUFF ");

    var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject (myJSON);


लिंक अब मान्य नहीं है
Myles J

थैंक्स माइल्स जे, मैंने एक नई साइट पर अपडेट किया जो ठीक काम करने लगती है।
जेसन हिचिंग्स

0

JSON स्ट्रिंग को C # में ऑब्जेक्ट में कनवर्ट करें। नीचे परीक्षण के मामले का उपयोग .. मेरे लिए काम किया। यहाँ " MenuInfo " मेरी C # क्लास ऑब्जेक्ट है।

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);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.