将JSONstring转换为C#对象

尝试将JSONstring转换为C#中的对象。 使用一个非常简单的testing用例:

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

问题是routes_list永远不会被设置; 这是一个未定义的对象。 有任何想法吗?

它看起来像你试图反序列化到一个原始对象。 您可以创build一个代表要转换的对象的类。 在处理大对象或JSONstring的情况下,这将非常有用。

例如:

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

更多信息可以在这个教程中find: http : //www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

或者,您可以使用Newtownsoft.Json库如下所示:

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

其中T是与您的JSONstring匹配的对象types。

您可能不希望将routes_list声明为objecttypes。 它没有.test属性,所以你真的不会得到一个很好的对象。 这是你最好定义一个类或一个结构,或使用dynamic关键字的地方之一。

如果你真的想让这个代码像你一样工作,你需要知道DeserializeObject返回的对象是一个string,对象的通用字典。 以下是这样做的代码:

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

如果你想使用dynamic关键字, 你可以阅读如何在这里 。

如果你声明一个类或结构,你可以调用Deserialize而不是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); } } 

在JavaScriptSerializer中使用dynamic对象。

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

Newtonsoft比java脚本串行器更快。 …这个取决于Newtonsoft NuGet包,它比默认的序列化器更stream行,更好。

一行代码解决scheme。

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

这是一个简单的课,我从各种岗位上拼凑起来的……它已经testing了大约15分钟,但似乎为我的目的工作。 它使用JavascriptSerializer来完成这项工作,可以使用这篇文章中详细介绍的信息在您的应用程序中引用它 。

下面的代码可以在LinqPad中运行来testing:

  • 右键单击LinqPad中的脚本选项卡,然后select“查询属性”
  • 在“其他引用”中引用“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; } } 

您可以使用Newtonsoft.Json库轻松完成您的需求。 我正在写下下面的一个例子来看看它。

您收到的对象types:

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

这是parsing你的json的一个非常简单的方法。

添加这个ddl引用到您的项目: System.Web.Extensions.dll

使用这个命名空间: 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); 

将这些步骤半自动化的另一种快速而简单的方法是:

  1. 把你想parsing的JSON粘贴到这里: http : //json2csharp.com/然后把结果复制并粘贴到Visual Studio中的新类(例如:MyClass)中。
  2. 将json2csharp的输出中的“RootObject”重命名为“MyClass”或任何你所谓的。
  3. 在Visual Studio中,转到网站 – >pipe理包,使用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); 

将JSONstring转换为C#中的对象。 使用下面的testing案例..它为我工作。 这里“ 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);