c# - newtonsoft - Cómo analizar JSON sin la biblioteca JSON.NET?
serializar json c# (6)
Intento crear una aplicación Metro para Windows 8 en Visual Studio 2011. Y mientras trato de hacerlo, tengo algunos problemas sobre cómo analizar JSON
sin la biblioteca JSON.NET
(No es compatible con aplicaciones de metro todavía).
De todos modos, quiero analizar esto:
{
"name":"Prince Charming",
"artist":"Metallica",
"genre":"Rock and Metal",
"album":"Reload",
"album_image":"http:////up203.siz.co.il//up2//u2zzzw4mjayz.png",
"link":"http:////f2h.co.il//7779182246886"
}
¿Has probado con JavaScriptSerializer
? También hay DataContractJsonSerializer
He lanzado una biblioteca .NET llamada Tiferix.Json que le permite serializar y deserializar archivos Json hacia y desde objetos ADO.Net DataSet y DataTable. Este proyecto es un trabajo en progreso y en los próximos 6 meses (con suerte) ampliaré la funcionalidad para permitir la serialización de varios tipos de clases y objetos .Net, incluidas las clases dinámicas y los tipos anónimos. A partir de ahora, la biblioteca Tiferix.Json no tiene un JsonDataReader en bruto, pero tiene una clase bastante poderosa JsonDataWriter que puede escribir archivos Json del mismo tipo que un .NET Binary o StreamWriter. El JsonDataWriter de la biblioteca Tiferix.Json también tiene la capacidad de autoidentificar sus archivos Json, que es una característica muy útil que no he visto en ninguna otra biblioteca Json, incluida Json.Net.
Si está interesado, puede ver el proyecto Tiferix.Json en mi página Github y descargar las bibliotecas y dlls. El Tiferix.Json ofrece una alternativa mucho más simple y liviana a la biblioteca Json.Net más completa y también es menos rígida y más fácil de usar (en mi opinión) que las clases .Net Json nativas.
Para aquellos que no tienen 4.5, esta es la función de mi biblioteca que dice json. Requiere una referencia de proyecto a System.Web.Extensions
.
using System.Web.Script.Serialization;
public object DeserializeJson<T>(string Json)
{
JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
return JavaScriptSerializer.Deserialize<T>(Json);
}
Por lo general, json se escribe según un contrato. Ese contrato puede y generalmente será codificado en una clase ( T
). Algunas veces puede tomar una palabra del json y buscar el buscador de objetos para encontrar ese tipo.
Ejemplo de uso:
Dado el json
{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
Podría analizarlo en un objeto RadComboBoxClientState
como este:
string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;
Puede usar DataContractJsonSerializer
. Vea este link para más detalles.
Puede usar las clases que se encuentran en System.Json Namespace que se agregaron en .NET 4.5. Debe agregar una referencia al ensamblado System.Runtime.Serialization
El método JsonValue.Parse () analiza el texto JSON y devuelve un JsonValue :
JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");
Si pasa una cadena con un objeto JSON, debería poder convertir el valor a un JsonObject :
using System.Json;
JsonObject result = value as JsonObject;
Console.WriteLine("Name .... {0}", (string)result["name"]);
Console.WriteLine("Artist .. {0}", (string)result["artist"]);
Console.WriteLine("Genre ... {0}", (string)result["genre"]);
Console.WriteLine("Album ... {0}", (string)result["album"]);
Las clases son bastante similares a las que se encuentran en el espacio de nombres System.Xml.Linq .
Uso esto ... pero nunca he hecho ningún desarrollo de aplicación de metro, así que no sé de ninguna restricción sobre las bibliotecas disponibles para ti. (tenga en cuenta que deberá marcar sus clases como con los atributos DataContract y DataMember)
public static class JSONSerializer<TType> where TType : class
{
/// <summary>
/// Serializes an object to JSON
/// </summary>
public static string Serialize(TType instance)
{
var serializer = new DataContractJsonSerializer(typeof(TType));
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, instance);
return Encoding.Default.GetString(stream.ToArray());
}
}
/// <summary>
/// DeSerializes an object from JSON
/// </summary>
public static TType DeSerialize(string json)
{
using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(typeof(TType));
return serializer.ReadObject(stream) as TType;
}
}
}
Entonces, si tuvieras una clase como esta ...
[DataContract]
public class MusicInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Artist { get; set; }
[DataMember]
public string Genre { get; set; }
[DataMember]
public string Album { get; set; }
[DataMember]
public string AlbumImage { get; set; }
[DataMember]
public string Link { get; set; }
}
Entonces lo usarías así ...
var musicInfo = new MusicInfo
{
Name = "Prince Charming",
Artist = "Metallica",
Genre = "Rock and Metal",
Album = "Reload",
AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
Link = "http://f2h.co.il/7779182246886"
};
// This will produce a JSON String
var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo);
// This will produce a copy of the instance you created earlier
var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);