JSON Dizesini C # Nesnesine Dönüştür


183

Bir JSON dizesini C # 'daki bir nesneye dönüştürmeye çalışıyorum. Gerçekten basit bir test senaryosu kullanmak:

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

Sorun, route_list'in asla ayarlanmamasıdır; tanımsız bir nesne. Herhangi bir fikir?


1
@Greg: WCF'nin JavaScriptSerializerözel JSON biçimlendirmesinden başka bir şey kabul etmeyeceği için aslında MS'nin sürümünü öneriyorum (örneğin tarihlere benzeyen ancak DATE () ile çevrili olmayan tarih alanları sefil bir şekilde başarısız oluyor)
Brad Christie

Ayrıca, aslında harika bir öğretici olan .NET makalesinde JavascriptSerializer ile bu Ayrıştırma JSON nesnelerine bakın.
scatmoi

JavaScriptSerializer'ı nereden alıyorsunuz? C # .NET 3.5 projemde tanınmıyor.
B. Clay Shannon

1
@B. Clay Shannon Bu benim için çözdü stackoverflow.com/questions/7000811/…
Fuzzybear

Yanıtlar:


127

Ham bir nesneye serileştirmeye çalıştığınız anlaşılıyor. Dönüştürmekte olduğunuz nesneyi temsil eden bir Sınıf oluşturabilirsiniz. Bu, daha büyük nesneler veya JSON Dizeleri ile uğraştığınız durumlarda en yararlı olacaktır.

Örneğin:

  class Test {

      String test; 

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

  }

Ardından, serileştirme kodunuz:

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

Bu eğiticide daha fazla bilgi bulunabilir: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx


1
Ancak sivri uçlu makalede otomatik özellikler kullanılır. Bahsetmeye değer.
Ivan Kochurkin

11
Üzgünüz, ancak bu kod örneği çalışmıyor. DeserializeObject bir istisna verir. Var route_list = serializer.Deserialize <Test> ("{\" test \ ": \" bazı veriler \ "}") kullanın; yerine. Ayrıca, get / setTest () ve String testinin herkese açık olması gerekmez. C # 'dan çok java'ya benziyor.
dvallejo

Dan Vallejo'nun belirttiği gibi, bu yanlış bir çözümdür. Sonuçta, setTest (String test) döndürülmüyor, bu da derleme hatası.
Payam

1
Bunu da kullanabilir: json_serializer.Deserialize <Test> ("{\" test \ ": \" bazı veriler \ "}"); // (Test) yerine json_serializer .....
Beşar Abu Shamaa

1
Sınıf nesnenizin biçiminden emin değilseniz, bu bağlantıyı deneyin . Json dizginizi doğru sınıflara çevirir. Beni bir ton kurtardı!
jade290

231

Veya Newtownsoft.Json kütüphanesini aşağıdaki gibi kullanabilirsiniz:

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

TJSON dizenizle eşleşen nesne türünüz nerede .


3
Çok kolay ve bunu nasıl yapacağımı çok düşündüm.
maracuja-juice

58

Muhtemelen route_list'i bir objecttür olarak ilan etmek istemezsiniz . Bir .test özelliği yok, bu yüzden gerçekten güzel bir nesne geri almayacaksınız. Bu, bir sınıf veya yapı tanımlamaktan veya dinamik anahtar kelimeden daha iyi yararlanabileceğiniz yerlerden biridir.

Bu kodun gerçekten sizin gibi çalışmasını istiyorsanız, DeserializeObject tarafından döndürülen nesnenin genel bir dize, nesne sözlüğü olduğunu bilmeniz gerekir. İşte bu şekilde yapmak için kod:

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

Dinamik anahtar kelimeyi kullanmak istiyorsanız, nasıl yapılacağını buradan okuyabilirsiniz .

Bir sınıf veya yapı bildirirseniz, DeserializeObject yerine Deserialize öğesini çağırabilirsiniz:

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

Yapılması: json_serializer = new JavaScriptSerializer (); object route_list = (IDictionary <dize, nesne>) json_serializer.DeserializeObject ("{\" test \ ": \" burada bazı veriler \ "}"); Geçerli bağlamda hala 'route_list' alınıyor.
Justin

1
Kullanma object routes_list. varKendinizi kullanın veya açık bir şekilde tekrarlayın ve route_list'ini IDictionary <string, object> olarak bildirin.
mattmc3

31

JavaScriptSerializer ile dinamik nesne kullanma.

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

//test Result = "some data"

19

Newtonsoft, java script serileştiricisinden daha hızlıdır. ... bu, popüler ve varsayılan serileştiriciden daha iyi olan Newtonsoft NuGet paketine bağlıdır.

bir satır kod çözümü.

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

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

15

İşte çeşitli mesajlardan bir araya topladığım basit bir sınıf ... Yaklaşık 15 dakika boyunca test edildi, ancak benim amacım için çalışıyor gibi görünüyor . Bu yayında JavascriptSerializerayrıntılı olarak verilen bilgileri kullanarak uygulamanızda referans verilebilecek işi yapmak için kullanır .

Aşağıdaki kod LinqPad'de şu şekilde test edilebilir:

  • LinqPad'de komut dosyası sekmenize sağ tıklayın ve "Sorgu Özellikleri" ni seçin
  • "Ek Referanslar" bölümündeki "System.Web.Extensions.dll" ye başvurma
  • "System.Web.Script.Serialization" bir "Ek Ad Alanı İçe Aktarma" ekleme.

Umarım yardımcı olur!

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

Newtonsoft.Json kütüphanesini kullanarak gereksiniminizi kolayca yerine getirebilirsiniz. Aşağıda bir örneği yazıyorum, içine bir göz atın.

Aldığınız nesne türü için sınıf:

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

}

Kod:

static void Main(string[] args)
{

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

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

      Console.ReadKey();
}

bu json'unuzu ayrıştırmanın çok basit bir yoludur.


11

Tripletdad99'un dediği gibi

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

ancak fazladan bir nesne oluşturmak istemiyorsanız Dictionarybunun yerine

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

Bu yararlıdır, daha sonra parametreleri Url.Action'a (eylem, denetleyici, sonuç)
iletirsiniz

8

bu ddl projenize başvurmak için ekleyin: System.Web.Extensions.dll

bu ad alanını kullanın: using 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'unuzu kopyalayın ve json2csharp'taki metin kutusuna yapıştırın ve Oluştur düğmesine tıklayın.

Aşağıdaki gibi cs dosyası kullanılarak bir cs sınıfı oluşturulacaktır

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObjectOluşturulan cs dosyasının adı nerede ;


4

Bu adımları yarı otomatik hale getirmenin bir başka hızlı ve kolay yolu:

  1. Ayrıştırmak istediğiniz JSON'u alın ve buraya yapıştırın: https://app.quicktype.io/ . Açılır menüde dili C # olarak değiştirin.
  2. Sol üstteki adı sınıf adınıza güncelleyin, varsayılan olarak "Hoş Geldiniz" olur.
  3. Visual studio'da Web Sitesi -> Paketleri Yönet'e gidin ve Newtonsoft'tan Json.Net'i eklemek için NuGet'i kullanın.
  4. app.quicktype.io Newtonsoft dayalı seri hale getirme yöntemleri. Alternatif olarak, artık aşağıdaki gibi bir kod kullanabilirsiniz:

    WebClient istemcisi = yeni WebClient ();

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

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


Bağlantı artık geçerli değil
Myles J

Teşekkürler Myles J, iyi çalışıyor gibi görünen yeni bir siteye güncelledim.
Jason Hitchings

0

JSON dizesini C # içindeki bir nesneye dönüştürün. Aşağıdaki test durumda kullanarak .. benim için çalıştı. Burada " MenuInfo " benim C # sınıfı nesnesidir.

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

Öncelikle aşağıdaki gibi bir kütüphane eklemelisiniz:

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.