2011-01-06 78 views
118

試圖將JSON字符串轉換爲C#中的對象。使用一個非常簡單的測試用例:將JSON字符串轉換爲C#對象

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

問題是routes_list永遠不會被設置;這是一個未定義的對象。有任何想法嗎?

+1

@格雷格:其實,我建議'在MS的JavaScriptSerializer'版本,因爲它不會接受除WCF的自定義JSON格式外的其他任何東西(例如,日期字段看起來像日期但未包含在DATE()中)失敗慘重 – 2011-01-06 01:50:03

+0

此外,請看[使用.NET中的JavascriptSerializer解析JSON對象](http:// www .tomasvera.com /編程/ using-javascriptserializer-to-parse-json-objects /)文章,這實際上是一個很好的教程。 – scatmoi 2012-10-23 17:50:18

+0

你在哪裏獲得JavaScriptSerializer?它在我的C#.NET 3.5項目中無法識別。 – 2013-10-15 20:47:00

回答

92

它看起來像你試圖反序列化到原始對象。您可以創建一個表示要轉換爲的對象的類。這對於處理較大對象或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

但在尖銳的文章中使用autoproperties。這也值得一提。 – 2012-09-18 12:50:07

+7

對不起,但此代碼示例不起作用。 DeserializeObject提供了一個例外。使用var routes_list = serializer.Deserialize (「{\」test \「:\」some data \「}」);代替。另外,你不需要get/setTest()和String test,應該公開。這看起來更像Java而不是C#。丹巴列霍提到的 – dvallejo 2013-10-08 16:47:08

+0

,這是一個不正確的解決方案。畢竟,setTest(String test)沒有返回,這也是編譯錯誤。 – user843681 2014-08-18 03:05:55

48

您可能不希望將routes_list聲明爲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"]); 

如果要使用動態關鍵字,you can read how here

如果要聲明一個類或結構,你可以調用反序列化,而不是DeserializeObject像這樣:

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

在做: json_serializer = new JavaScriptSerializer(); object routes_list =(IDictionary )json_serializer.DeserializeObject(「{\」test \「:\」some data here \「}」); 在當前上下文中仍然不存在'routes_list'。 – Justin 2011-01-06 02:00:17

+0

不要使用'objects routes_list'。使用'var'或明確重複自己,並將routes_list聲明爲IDictionary 。 – mattmc3 2011-01-06 02:06:17

+0

這爲我工作,謝謝!!,選擇的解決方案沒有! – 2015-01-23 15:10:38

11

這裏有一個簡單的類我拼湊從各種職位....它已被測試約15分鐘,但似乎爲我的目的工作。它使用JavascriptSerializer來完成這項工作,可以使用詳細信息in this post在您的應用中引用該工作。

下面的代碼可以在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; 
    } 
} 
5

添加此DDL引用到您的項目:System.Web.Extensions.dll

使用此命名空間:使用System.Web.Script。序列化;

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

哪裏T是你的JSON字符串匹配的對象類型:

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

或者,你可以按如下方式使用Newtownsoft.Json庫。

+0

這很容易,我想如何做到這一點很久。 – 2017-06-12 12:21:02

25

在JavaScriptSerializer中使用動態對象。

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

//test Result = "some data" 
16

Newtonsoft比java script serializer更快。 ...這個取決於Newtonsoft NuGet包,它比默認的序列化器更流行,更好。

單行代碼解決方案。

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

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

您可以使用Newtonsoft.Json庫輕鬆實現您的需求。我正在寫下下面的一個例子來看看它。

爲類對象的類型,你收到:

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。

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

另一種快速簡便的方法,以半自動化這些步驟是:

  1. 採取JSON要分析並粘貼到此處:http://json2csharp.com/然後複製,並將所得粘貼到一個新的類(例如:MyClass)在visual studio中。
  2. 將json2csharp的輸出中的「RootObject」重命名爲「MyClass」或您稱之爲的任何內容。
  3. 在visual studio中,轉至網站 - >管理軟件包並使用NuGet從Newtonsoft添加Json.Net。

現在使用如下代碼:

WebClient client = new WebClient(); 

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

var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON); 
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); 
} 
相關問題