Hay Jsonen System.Web.Helpers, hay JsonQueryStringConverteren el System.ServiceModel.Web, no hay JavascriptSerializeren System.Web.Script.Serialization, DataContractJsonSerializeren System.Runtime.Serialization.Json, diablos, incluso MS ha decidido incluir terceros Json.NETen su API Web ASP.NET. Si pensabas que eso no era suficiente, la EM está surgiendo System.Jsonpero actualmente no es apta para el consumo. Way to go Microsoft way to go ... Elijo por el mejor espacio de nombres.
nawfal
44
@fusi el resto están en asambleas separadas. Google el nombre del espacio de nombres / clase, encontrará el ensamblaje en la documentación de msdn. Simplemente agregue referencia a ese ensamblaje.
nawfal
1
Sólo para completar, hay también JsonValueen Windows.Data.Jsonque es sólo para Windows 8 o superior. Me encanta. MS está en una misión :)
¿Puedo deserializar a una varvariable de tipo, en el caso de que no conozca la estructura completa de mi objetivo? Específicamente, estoy consumiendo Historias de usuarios de Rally y quiero convertirlas en objetos.
Pedro Dusso
16
@VANDERWEYENJonathan: en un navegador web moderno, JSON.parse (cadena) y JSON.stringify (objeto) manejan las fechas como cadenas ISO8601, que es el formato representado en la respuesta anterior. Es posible que desee actualizar su estándar antes de que las personas decidan que es irrelevante. Las personas necesitan fechas mucho más de lo que necesitan su estándar.
Peter Wone
3
@PeterWone: No, JSON.parse('{"Expiry": "2008-12-28T00:00:00"}').Expirydevuelve la cadena"2008-12-28T00:00:00" , no una fecha. se puede convertir en una Datevía new Date(str), pero JSON.parseno sabe nada sobre fechas. Tendría que pasar un reviver que verificara cada valor de cadena contra un patrón.
TJ Crowder
3
Dado que 3.703 segundos es lo mismo que 3s y 703ms y el separador es un punto decimal, les digo que esto es segundos a tres decimales.
Peter Wone
38
¿Por qué todo el mundo tiene ese problema con la inclusión relevantes require, include, importo usingdeclaraciones en sus respuestas. ¿Le dolería esa línea?
@ MaxHodges, tienes razón. Acabo de utilizar "cadenas mágicas" en línea para demostrar cómo analizar los valores de cadena JSON. No quería que se viera complejo con comillas dobles escapadas. En código real, generalmente tenemos cadenas JSON obtenidas de algún lugar como variables o pasadas como parámetros.
Dmitry Pavlov
44
Sin .net 4 no tienes una palabra clave 'dinámica'. Puede usar 'var stuff' para la declaración y en lugar de 'stuff.Name' y 'stuff.Address.City' tiene 'stuff ["Name"]' y 'stuff ["Address"] ["City"]' respectivamente .
Fil
1
@Fil Eso le da un valor de tipo object, y no puede usar la indexación en un object.
Alex
138
Aquí hay algunas opciones sin usar bibliotecas de terceros:
// For that you will need to add reference to System.Runtime.Serializationvar jsonReader =JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"),newSystem.Xml.XmlDictionaryReaderQuotas());// For that you will need to add reference to System.Xml and System.Xml.Linqvar root =XElement.Load(jsonReader);Console.WriteLine(root.XPathSelectElement("//Name").Value);Console.WriteLine(root.XPathSelectElement("//Address/State").Value);// For that you will need to add reference to System.Web.Helpersdynamic json =System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");Console.WriteLine(json.Name);Console.WriteLine(json.Address.State);
¿Por qué no veo System.Web.Helpers en mi sitio web ASP.NET (4.5)? XElement, XPathSelectElement no son conocidos para mi VisualStudio. ¿Cómo educarlo?
Budda
Bueno, debe agregar referencias para las bibliotecas correspondientes (como está escrito en los comentarios anteriores), consulte este artículo para obtener más información. Además, esta pregunta puede ser de interés.
qqbenq
2
Utilicé el método Web.Helpers descrito aquí, pero me encontré con un problema que fue resuelto por esta publicación: stackoverflow.com/questions/7066726/…
Alex
1
funciona con WPF. Usando el siguiente espacio de nombres usando System.Runtime.Serialization.Json; usando System.Xml.XPath; usando System.Xml.Linq;
WebClient webClient =newWebClient();dynamic result =JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));Console.WriteLine(result.response.user.firstName);
Esa última consola. WriteLine es bastante dulce ...
No sé qué clase de ElonU quiso decir aquí, pero hay "JsonValue" en Windows.Data.Json (que es solo para Windows 8 y superior, extraño) y también el mismo "JsonValue" en System.Json que todavía está en vista previa y Solo Dios sabe si saldrá alguna vez. MS me confunde cuando se trata de Json.
nawfal
35
Otra solución nativa para esto, que no requiere ninguna biblioteca de terceros, sino una referencia a System.Web.Extensions es el JavaScriptSerializer. Esta no es una característica incorporada nueva pero muy desconocida desde 3.5.
Esto es muy bueno, pero necesita los componentes web, por lo que desafortunadamente no funciona en .NET 4.0 Client Profile, que es la última versión de .NET para Windows XP. La instalación completa de .NET es posible, pero muchas personas se quedan solo con Client Profile. Por el contrario, System.Runtime.Serialization.Json.DataContractJsonSerializer se admite incluso en el Perfil del cliente.
Al Kepp
3
@ fr34kyn01535: Windows XP tiene la segunda mayor cuota de mercado en computadoras de escritorio. Es relevante.
DonkeyMaster
Cuando utilicé JavaScriptSerializer para deseriarizar mi objeto, funcionó pero deserializó mi fecha incorrectamente. Debería haber sido 19/04/2018 12:00 AM pero deserializado a 18/04/2018 08:00 PM. NewtonSoft.Json.JsonConvert lo deserializó como se esperaba.
// PM>Install-Package System.Json -Version 4.5.0
using System;
using System.Json;
namespace NetCoreTestConsoleApp{classProgram{staticvoidMain(string[] args){// Note that JSON keys are case sensitive, a is not same as A.// JSON Samplestring jsonString ="{\"a\": 1,\"b\": \"string value\",\"c\":[{\"Value\": 1}, {\"Value\": 2,\"SubObject\":[{\"SubValue\":3}]}]}";// You can use the following line in a beautifier/JSON formatted for better view// {"a": 1,"b": "string value","c":[{"Value": 1}, {"Value": 2,"SubObject":[{"SubValue":3}]}]}/* Formatted jsonString for viewing purposes:
{
"a":1,
"b":"string value",
"c":[
{
"Value":1
},
{
"Value":2,
"SubObject":[
{
"SubValue":3
}
]
}
]
}
*/// Verify your JSON if you get any errors hereJsonValue json =JsonValue.Parse(jsonString);// int testif(json.ContainsKey("a")){int a = json["a"];// type already set to intConsole.WriteLine("json[\"a\"]"+" = "+ a);}// string testif(json.ContainsKey("b")){string b = json["b"];// type already set to stringConsole.WriteLine("json[\"b\"]"+" = "+ b);}// object array testif(json.ContainsKey("c")&& json["c"].JsonType==JsonType.Array){// foreach loop testforeach(JsonValue j in json["c"]){Console.WriteLine("j[\"Value\"]"+" = "+ j["Value"].ToString());}// multi level key testConsole.WriteLine("json[\"c\"][0][\"Value\"]"+" = "+ json["c"][0]["Value"].ToString());Console.WriteLine("json[\"c\"][0][\"Value\"]"+" = "+ json["c"][1]["Value"].ToString());Console.WriteLine("json[\"c\"][1][\"SubObject\"][0][\"SubValue\"]"+" = "+ json["c"][1]["SubObject"][0]["SubValue"].ToString());}Console.WriteLine();Console.Write("Press any key to exit.");Console.ReadKey();}}}
Tratar de encontrar un ejemplo de cómo usar correctamente el System.Json moderno me ha traído aquí, después de innumerables resultados para Json.NET/Newtonsoft.Json/"Newtson.Json "y las versiones anteriores de System.Json desde hace mucho tiempo en desuso. Gracias por esto.
monkey0506
1
Esto me ayudó de una manera enorme. Muchas gracias.
MAK
10
Use esta herramienta para generar una clase basada en su json:
Gracias, quería la parte ["resultado" + variable] porque quería usar variables para usar aquí, lo cual no se puede hacer fácilmente con JSON.NET.
PHPGuru
¿Esta línea está haciendo algo ... JavaScriptSerializer js = new JavaScriptSerializer (); Gracias por adelantado.
Chris Catignani
9
System.Text.Json
.NET core 3.0 viene con System.Text.Jsonincorporado, lo que significa que puede deserializar / serializar JSON sin usar una biblioteca de terceros.
Para serializar su (s) clase (s) a una cadena JSON:
var json =JsonSerializer.Serialize(order);
Para deserializar el JSON en una clase fuertemente tipada:
var order =JsonSerializer.Deserialize<Order>(json);
Entonces, si tienes una clase como la siguiente:
publicclassOrder{publicintId{get;set;}publicstringOrderNumber{get;set;}publicdecimalBalance{get;set;}publicDateTimeOpened{get;set;}}var json =JsonSerializer.Serialize(order);// creates JSON ==>{"id":123456,"orderNumber":"ABC-123-456","balance":9876.54,"opened":"2019-10-21T23:47:16.85",};var order =JsonSerializer.Deserialize<Order>(json);// ==> creates the above class
Una cosa a tener en cuenta es que System.Text.Jsonno maneja automáticamente las camelCasepropiedades JSON cuando usa su propio código (sin embargo, lo hace cuando usa las solicitudes MVC / WebAPI y el modelo de carpeta).
Para resolver esto, debe pasar JsonSerializerOptionscomo parámetro.
JsonSerializerOptions options =newJsonSerializerOptions{PropertyNamingPolicy=JsonNamingPolicy.CamelCase,// set camelCase WriteIndented=true// write pretty json};// pass options to serializervar json =JsonSerializer.Serialize(order, options);// pass options to deserializervar order =JsonSerializer.Deserialize<Order>(json, options);
System.Text.Json también está disponible para .Net Framework y .Net Standard como un paquete Nu-get System.Text.Json
¿Qué pasa si no tienes una clase? ¿Qué pasa si solo sabes vagamente qué van a contener los datos json? ¿O si las llaves existen?
Cherona
@Cherona uso JsonDocument.Parse.
Haldo
5
Lo siguiente del sitio msdn debería, creo, ayudar a proporcionar alguna funcionalidad nativa para lo que está buscando. Tenga en cuenta que se especifica para Windows 8. Uno de estos ejemplos del sitio se enumera a continuación.
Agradable, pero "Cliente mínimo admitido: Windows 8"
watbywbarif
creo que ya no es compatible y ahora hay newtonsoft json dll icouldnt find windows.data.json
virtouso
3
@virtouso, como señaló watbywbarif, en realidad es bastante nuevo, aunque el soporte mínimo de Microsoft , solo funciona en Windows 8.
TargetofGravity
4
Puedes usar las siguientes extensiones
publicstaticclassJsonExtensions{publicstatic T ToObject<T>(thisstring jsonText){returnJsonConvert.DeserializeObject<T>(jsonText);}publicstaticstringToJson<T>(this T obj){returnJsonConvert.SerializeObject(obj);}}
Creo que la mejor respuesta que he visto ha sido @MD_Sayem_Ahmed.
Su pregunta es "¿Cómo puedo analizar Json con C #", pero parece que desea decodificar Json. Si quieres decodificarlo, la respuesta de Ahmed es buena.
Si está tratando de lograr esto en ASP.NET Web Api, la forma más fácil es crear un objeto de transferencia de datos que contenga los datos que desea asignar:
Simplemente ha agregado el encabezado application / json a su solicitud (si está utilizando Fiddler, por ejemplo). Luego usaría esto en la API web de ASP.NET de la siguiente manera:
//controller method -- assuming you want to post and return datapublicMyDtoPost([FromBody]MyDto myDto){MyDto someDto = myDto;/*ASP.NET automatically converts the data for you into this object
if you post a json object as follows:
{
"Name": "SomeName",
"Value": "SomeValue"
}
*///do some stuff}
Esto me ayudó mucho cuando estaba trabajando en mi Web Api e hizo que mi vida fuera muy fácil.
var result = controller.ActioName(objParams);IDictionary<string,object> data =(IDictionary<string,object>)newSystem.Web.Routing.RouteValueDictionary(result.Data);Assert.AreEqual("Table already exists.", data["Message"]);
Es mejor que explique su solución en lugar de simplemente publicar una fila de código. Puedes leer ¿Cómo escribo una buena respuesta ?
Massimiliano Kraus
No olvide incluir System.Weben su proyecto referencias.
Ohad Cohen el
-3
using (var ms =newMemoryStream(Encoding.Unicode.GetBytes(user))){// Deserialization from JSON DataContractJsonSerializer deserializer =newDataContractJsonSerializer(typeof(UserListing))DataContractJsonSerializer(typeof(UserListing));UserListing response =(UserListing)deserializer.ReadObject(ms);}publicclassUserListing{publicList<UserList> users {get;set;}}publicclassUserList{publicstringFirstName{get;set;}publicstringLastName{get;set;}}
Json
enSystem.Web.Helpers
, hayJsonQueryStringConverter
en elSystem.ServiceModel.Web
, no hayJavascriptSerializer
enSystem.Web.Script.Serialization
,DataContractJsonSerializer
enSystem.Runtime.Serialization.Json
, diablos, incluso MS ha decidido incluir tercerosJson.NET
en su API Web ASP.NET. Si pensabas que eso no era suficiente, la EM está surgiendoSystem.Json
pero actualmente no es apta para el consumo. Way to go Microsoft way to go ... Elijo por el mejor espacio de nombres.JsonValue
enWindows.Data.Json
que es sólo para Windows 8 o superior. Me encanta. MS está en una misión :)Respuestas:
Supongo que no está utilizando Json.NET (paquete Newtonsoft.Json NuGet). Si este es el caso, entonces deberías probarlo.
Tiene las siguientes características:
Mira el ejemplo a continuación. En este ejemplo, la
JsonConvert
clase se usa para convertir un objeto hacia y desde JSON. Tiene dos métodos estáticos para este propósito. Ellos sonSerializeObject(Object obj)
yDeserializeObject<T>(String json)
:fuente
var
variable de tipo, en el caso de que no conozca la estructura completa de mi objetivo? Específicamente, estoy consumiendo Historias de usuarios de Rally y quiero convertirlas en objetos.JSON.parse('{"Expiry": "2008-12-28T00:00:00"}').Expiry
devuelve la cadena"2008-12-28T00:00:00"
, no una fecha. se puede convertir en unaDate
víanew Date(str)
, peroJSON.parse
no sabe nada sobre fechas. Tendría que pasar un reviver que verificara cada valor de cadena contra un patrón.require
,include
,import
ousing
declaraciones en sus respuestas. ¿Le dolería esa línea?Como se respondió aquí: ¿ Deserializar JSON en un objeto dinámico C #?
Es bastante simple usar Json.NET:
O usando Newtonsoft.Json.Linq:
fuente
object
, y no puede usar la indexación en unobject
.Aquí hay algunas opciones sin usar bibliotecas de terceros:
Consulte el enlace para obtener más información sobre System.Web.Helpers.Json .
Actualización : hoy en día, la forma más fácil de obtener
Web.Helpers
es usar el paquete NuGet .Si no le interesan las versiones anteriores de Windows, puede usar las clases del
Windows.Data.Json
espacio de nombres:fuente
Si .NET 4 está disponible para usted, consulte: http://visitmix.com/writings/the-rise-of-json (archive.org)
Aquí hay un fragmento de ese sitio:
Esa última consola. WriteLine es bastante dulce ...
fuente
Otra solución nativa para esto, que no requiere ninguna biblioteca de terceros, sino una referencia a System.Web.Extensions es el JavaScriptSerializer. Esta no es una característica incorporada nueva pero muy desconocida desde 3.5.
..
y de regreso
fuente
También puede echar un vistazo a DataContractJsonSerializer
fuente
System.Json funciona ahora ...
Instale nuget https://www.nuget.org/packages/System.Json
Muestra :
fuente
Use esta herramienta para generar una clase basada en su json:
http://json2csharp.com/
Y luego usa la clase para deserializar tu json. Ejemplo:
Referencias: https://forums.asp.net/t/1992996.aspx?Nested+Json+Deserialization+to+C+object+and+using+that+object https://www.newtonsoft.com/json/help /html/DeserializeObject.htm
fuente
Prueba el siguiente código:
fuente
System.Text.Json
.NET core 3.0 viene con
System.Text.Json
incorporado, lo que significa que puede deserializar / serializar JSON sin usar una biblioteca de terceros.Para serializar su (s) clase (s) a una cadena JSON:
Para deserializar el JSON en una clase fuertemente tipada:
Entonces, si tienes una clase como la siguiente:
Una cosa a tener en cuenta es que
System.Text.Json
no maneja automáticamente lascamelCase
propiedades JSON cuando usa su propio código (sin embargo, lo hace cuando usa las solicitudes MVC / WebAPI y el modelo de carpeta).Para resolver esto, debe pasar
JsonSerializerOptions
como parámetro.System.Text.Json también está disponible para .Net Framework y .Net Standard como un paquete Nu-get System.Text.Json
fuente
JsonDocument.Parse
.Lo siguiente del sitio msdn debería, creo, ayudar a proporcionar alguna funcionalidad nativa para lo que está buscando. Tenga en cuenta que se especifica para Windows 8. Uno de estos ejemplos del sitio se enumera a continuación.
Utiliza el espacio de nombres Windows.Data.JSON .
fuente
Puedes usar las siguientes extensiones
fuente
Creo que la mejor respuesta que he visto ha sido @MD_Sayem_Ahmed.
Su pregunta es "¿Cómo puedo analizar Json con C #", pero parece que desea decodificar Json. Si quieres decodificarlo, la respuesta de Ahmed es buena.
Si está tratando de lograr esto en ASP.NET Web Api, la forma más fácil es crear un objeto de transferencia de datos que contenga los datos que desea asignar:
Simplemente ha agregado el encabezado application / json a su solicitud (si está utilizando Fiddler, por ejemplo). Luego usaría esto en la API web de ASP.NET de la siguiente manera:
Esto me ayudó mucho cuando estaba trabajando en mi Web Api e hizo que mi vida fuera muy fácil.
fuente
fuente
fuente
System.Web
en su proyecto referencias.fuente