Konversi JSON String ke C # Object

183

Mencoba mengubah string JSON menjadi objek dalam C #. Menggunakan uji kasus yang sangat sederhana:

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

Masalahnya adalah bahwa route_list tidak pernah disetel; itu adalah objek yang tidak terdefinisi. Ada ide?

Justin
sumber
1
@Reg: Saya benar-benar merekomendasikan versi JavaScriptSerializerlebih MS karena tidak akan menerima apa pun selain format JSON kustom WCF (misalnya bidang tanggal yang terlihat seperti tanggal tetapi tidak dikelilingi pada DATE () gagal total)
Brad Christie
Juga, lihat objek Parsing JSON ini dengan JavascriptSerializer di artikel .NET , yang sebenarnya adalah tutorial yang bagus.
scatmoi
Di mana Anda mendapatkan JavaScriptSerializer? Itu tidak dikenali dalam proyek C # .NET 3.5 saya.
B. Clay Shannon
1
@B. Clay Shannon Ini menyelesaikannya untuk saya stackoverflow.com/questions/7000811/…
Fuzzybear

Jawaban:

127

Sepertinya Anda mencoba deserialize ke objek mentah. Anda bisa membuat Kelas yang mewakili objek yang Anda konversi. Ini akan sangat berguna jika Anda berurusan dengan objek yang lebih besar atau String JSON.

Misalnya:

  class Test {

      String test; 

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

  }

Maka kode deserialisasi Anda akan:

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

Informasi lebih lanjut dapat ditemukan dalam tutorial ini: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

jmort253
sumber
1
Namun dalam artikel runcing autoproperties digunakan. Ini layak disebut juga.
Ivan Kochurkin
11
Maaf, tetapi contoh kode ini tidak berfungsi. DeserializeObject memberikan pengecualian. Gunakan var routes_list = serializer.Deserialize <Test> ("{\" test \ ": \" some data \ "}"); sebagai gantinya. Selain itu, Anda tidak perlu mendapatkan / setTest (), dan tes String, harus bersifat publik. Ini lebih mirip java daripada C #.
dvallejo
seperti yang disebutkan Dan Vallejo, ini adalah solusi yang salah. Bagaimanapun, setTest (String test) tidak kembali, yang juga merupakan kesalahan kompilasi.
Payam
1
Dapat juga menggunakan ini: json_serializer.Deserialize <Test> ("{\" test \ ": \" some data \ "}"); // alih-alih (Uji) json_serializer .....
Bashar Abu Shamaa
1
Jika Anda tidak yakin dengan format untuk objek kelas Anda, coba tautan ini . Ini menerjemahkan string Json Anda ke kelas yang tepat. Menghemat saya banyak waktu!
jade290
231

Atau, Anda dapat menggunakan perpustakaan Newtownsoft.Json sebagai berikut:

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

Di mana Tjenis objek Anda yang cocok dengan string JSON Anda.

tripletdad99
sumber
3
Sangat mudah dan saya berpikir panjang tentang bagaimana melakukan ini.
maracuja-jus
58

Anda mungkin tidak ingin hanya mendeklarasikan route_list sebagai objecttipe. Itu tidak memiliki properti .test, jadi Anda benar-benar tidak akan mendapatkan objek yang bagus kembali. Ini adalah salah satu tempat di mana Anda akan lebih baik mendefinisikan kelas atau struct, atau menggunakan kata kunci dinamis.

Jika Anda benar-benar ingin kode ini berfungsi seperti yang Anda miliki, Anda harus tahu bahwa objek yang dikembalikan oleh DeserializeObject adalah kamus umum string, objek. Berikut kode untuk melakukannya:

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

Jika Anda ingin menggunakan kata kunci dinamis, Anda dapat membaca caranya di sini .

Jika Anda mendeklarasikan kelas atau struct, Anda dapat memanggil Deserialize alih-alih DeserializeObject seperti:

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);
    }
}
mattmc3
sumber
Melakukan: json_serializer = JavaScriptSerializer baru (); object routes_list = (IDictionary <string, object>) json_serializer.DeserializeObject ("{\" test \ ": \" beberapa data di sini \ "}"); Masih mendapatkan 'routes_list' tidak ada dalam konteks saat ini.
Justin
1
Jangan gunakan object routes_list. Gunakan varatau ulangi secara eksplisit dan nyatakan rute_list sebagai IDictionary <string, objek>.
mattmc3
31

Menggunakan objek dinamis dengan JavaScriptSerializer.

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

//test Result = "some data"
İbrahim Özbölük
sumber
19

Newtonsoft lebih cepat dari serializer skrip java. ... yang ini tergantung pada paket Newtonsoft NuGet, yang populer dan lebih baik daripada serializer default.

satu solusi kode baris.

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

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

Inilah kelas sederhana yang saya buat bersama-sama dari berbagai posting .... Ini telah diuji selama sekitar 15 menit, tetapi tampaknya berhasil untuk tujuan saya. Ini digunakan JavascriptSerializeruntuk melakukan pekerjaan, yang dapat dirujuk di aplikasi Anda menggunakan info yang dirinci dalam posting ini .

Kode di bawah ini dapat dijalankan di LinqPad untuk mengujinya dengan:

  • Klik kanan pada tab skrip Anda di LinqPad, dan pilih "Query Properties"
  • Merujuk pada "System.Web.Extensions.dll" di "Referensi Tambahan"
  • Menambahkan "Impor Namespace Tambahan" dari "System.Web.Script.Serialization".

Semoga ini bisa membantu!

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;
  }
}
Taman Brad
sumber
14

Anda dapat memenuhi kebutuhan Anda dengan mudah dengan menggunakan perpustakaan Newtonsoft.Json. Saya menuliskan satu contoh di bawah ini untuk melihatnya.

Kelas untuk jenis objek yang Anda terima:

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

}

Kode:

static void Main(string[] args)
{

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

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

      Console.ReadKey();
}

ini adalah cara yang sangat sederhana untuk mengurai json Anda.

Mirza Danish Baig
sumber
11

Seperti kata tripletdad99

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

tetapi jika Anda tidak ingin membuat objek tambahan Anda dapat membuatnya dengan Dictionarysebaliknya

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
stanimirsp
sumber
Ini berguna, lalu Anda memberikan parameter ke Url.Action (action, controller, result)
Lapenkov Vladimir
8

tambahkan ddl ini ke referensi ke proyek Anda: System.Web.Extensions.dll

gunakan namespace ini: 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);
Thulasiram
sumber
6

Salin Json Anda dan tempel di kotak teks di json2csharp dan klik tombol Generate.

Kelas cs akan dibuat menggunakan file cs seperti di bawah ini

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

Di mana RootObjectnama file cs yang dihasilkan ;

Islam
sumber
4

Cara cepat dan mudah lain untuk mengotomatiskan langkah-langkah ini adalah dengan:

  1. ambil JSON yang ingin Anda parse dan rekatkan di sini: https://app.quicktype.io/ . Ubah bahasa menjadi C # di drop down.
  2. Perbarui nama di kiri atas dengan nama kelas Anda, defaultnya adalah "Selamat Datang".
  3. Di studio visual, buka Situs Web -> Kelola Paket dan gunakan NuGet untuk menambahkan Json.Net dari Newtonsoft.
  4. app.quicktype.io menghasilkan metode serialisasi berdasarkan Newtonsoft. Atau, sekarang Anda dapat menggunakan kode seperti:

    WebClient client = WebClient baru ();

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

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

Jason Hitchings
sumber
Tautan tidak lagi valid
Myles J
Terima kasih Myles J, saya memperbarui ke situs baru yang tampaknya berfungsi dengan baik.
Jason Hitchings
0

Konversi string JSON menjadi objek dalam C #. Menggunakan test case di bawah ini ... ini bekerja untuk saya. Di sini " MenuInfo " adalah objek kelas C # saya.

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);
Bhaskar
sumber
0

Pertama, Anda harus memasukkan perpustakaan seperti:

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);
}
Muhammad Zahid
sumber