Converter JSON String para object C #

Tentando converter uma string JSON em um object em C #. Usando um caso de teste realmente simples:

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

O problema é que o routes_list nunca é definido; é um object indefinido. Alguma ideia?

Parece que você está tentando desserializar para um object bruto. Você poderia criar uma class que representa o object para o qual você está convertendo. Isso seria mais útil nos casos em que você está lidando com objects maiores ou strings JSON.

Por exemplo:

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

Então o seu código de desserialização seria:

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

Mais informações podem ser encontradas neste tutorial: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

Ou você pode usar a biblioteca Newtownsoft.Json da seguinte maneira:

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

Onde T é o tipo de object que corresponde à sua string JSON.

Você provavelmente não quer apenas declarar routes_list como um tipo de object . Ele não tem uma propriedade .test, então você realmente não obterá um object legal de volta. Este é um daqueles lugares onde seria melhor definir uma class ou uma estrutura, ou fazer uso da palavra-chave dinâmica.

Se você realmente quer que este código funcione como você tem, você precisa saber que o object retornado por DeserializeObject é um dictionary genérico de string, object. Aqui está o código para fazer assim:

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

Se você quiser usar a palavra-chave dinâmica, leia como aqui .

Se você declarar uma class ou struct, você pode chamar Deserialize em vez de DeserializeObject assim:

 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("{ \"test\":\"some data\" }"); Console.WriteLine(routes_list.test); Console.WriteLine("Done..."); Console.ReadKey(true); } } 

Usando o object dynamic com JavaScriptSerializer.

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

Newtonsoft é mais rápido que o serializador de script java. … este depende do pacote Newtonsoft NuGet, que é popular e melhor que o serializador padrão.

uma solução de código de linha.

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

Aqui está uma class simples que eu montei de vários posts …. Ela foi testada por cerca de 15 minutos, mas parece funcionar para os meus propósitos. Ele usa JavascriptSerializer para fazer o trabalho, que pode ser referenciado em seu aplicativo usando as informações detalhadas nesta postagem .

O código abaixo pode ser executado no LinqPad para testá-lo por:

  • Clique com o botão direito do mouse na guia do script no LinqPad e escolha “Propriedades da Consulta”
  • Referenciando o “System.Web.Extensions.dll” em “Referências adicionais”
  • Adicionando um “Additional Namespace Imports” de “System.Web.Script.Serialization”.

Espero que ajude!

 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 classs here public class JsonDeserializer { private IDictionary jsonData { get; set; } public JsonDeserializer(string json) { var json_serializer = new JavaScriptSerializer(); jsonData = (IDictionary)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)curr[key]; } } } catch { // Probably means an invalid path (ie object doesn't exist) } return result; } } 

Você pode realizar sua exigência facilmente usando a biblioteca Newtonsoft.Json. Estou escrevendo o exemplo abaixo para dar uma olhada.

Classe para o tipo de object que você recebe:

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

Código:

 static void Main(string[] args) { string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}"; User user = JsonConvert.DeserializeObject(json); Console.ReadKey(); } 

Esta é uma maneira muito simples de analisar o seu json.

adicione este ddl para fazer referência ao seu projeto: System.Web.Extensions.dll

use este namespace: 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(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>(jsonStringCollection); 

Outra maneira rápida e fácil de semi-automatizar essas etapas é:

  1. pegue o JSON que você quer analisar e cole aqui: http://json2csharp.com/ depois copie e cole o resultado em uma nova class (ex: MyClass) no visual studio.
  2. Renomeie “RootObject” na saída de json2csharp para “MyClass” ou o que você chamou.
  3. No visual studio, acesse Website -> Gerenciar Pacotes e use o NuGet para adicionar o Json.Net da Newtonsoft.

Agora use o código como:

 WebClient client = new WebClient(); string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF"); var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON); 

Converta uma string JSON em um object em C #. Usando abaixo caso de teste .. funcionou para mim. Aqui ” MenuInfo ” é meu object de class 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(reader); 

Primeiro você tem que include biblioteca como:

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