Como analisar JSON sem biblioteca JSON.NET?

Eu estou tentando construir um aplicativo Metro para o Windows 8 no Visual Studio 2011. E enquanto eu estou tentando fazer isso, eu estou tendo alguns problemas sobre como analisar JSON sem biblioteca JSON.NET (ele não suporta o aplicações metropolitanas ainda).

De qualquer forma, quero analisar isso:

 { "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" } 

Você pode usar as classs encontradas no Namespace System.Json que foram adicionadas no .NET 4.5. Você precisa adicionar uma referência ao assembly System.Runtime.Serialization

O método JsonValue.Parse () analisa o texto JSON e retorna um JsonValue :

 JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ..."); 

Se você passar uma string com um object JSON, poderá converter o valor em um 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"]); 

As classs são bastante semelhantes às encontradas no Espaço para nome System.Xml.Linq .

Eu uso isso … mas nunca fiz nenhum desenvolvimento de aplicativo metropolitano, então não sei de nenhuma restrição sobre as bibliotecas disponíveis para você. (note que você precisará marcar suas classs como nos atributos DataContract e DataMember)

 public static class JSONSerializer where TType : class { ///  /// Serializes an object to JSON ///  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()); } } ///  /// DeSerializes an object from JSON ///  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; } } } 

Então, se você tivesse uma aula assim …

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

Então você usaria assim …

 var musicInfo = new MusicInfo { Name = "Prince Charming", Artist = "Metallica", Genre = "Rock and Metal", Album = "Reload", AlbumImage = "http://sofpt.miximages.com/c%23/u2zzzw4mjayz.png", Link = "http://f2h.co.il/7779182246886" }; // This will produce a JSON String var serialized = JSONSerializer.Serialize(musicInfo); // This will produce a copy of the instance you created earlier var deserialized = JSONSerializer.DeSerialize(serialized); 

Você já tentou usar o JavaScriptSerializer ? Há também o DataContractJsonSerializer

Para aqueles que não possuem 4.5, aqui está minha function de biblioteca que lê json. Requer uma referência de projeto para System.Web.Extensions .

 using System.Web.Script.Serialization; public object DeserializeJson(string Json) { JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer(); return JavaScriptSerializer.Deserialize(Json); } 

Normalmente, json é escrito com base em um contrato. Esse contrato pode e geralmente será codificado em uma class ( T ). Às vezes, você pode pegar uma palavra do json e pesquisar no navegador de objects para encontrar esse tipo.

Exemplo de uso:

Dado o json

 {"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false} 

Você poderia analisá-lo em um object RadComboBoxClientState como este:

 string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState"); RadComboBoxClientState RadComboBoxClientState = DeserializeJson(ClientStateJson); return RadComboBoxClientState.Value; 

Você pode usar o DataContractJsonSerializer . Veja este link para mais detalhes.

Eu liberei uma biblioteca .NET chamada Tiferix.Json que permite serializar e desserializar arquivos Json para e de objects ADO.Net DataSet e DataTable. Este projeto é um trabalho em andamento e nos próximos 6 meses (esperançosamente) expandirei a funcionalidade para permitir a serialização de vários tipos de classs e objects .Net, incluindo classs dinâmicas e tipos anônimos. A partir de agora, a biblioteca Tiferix.Json não possui um JsonDataReader bruto, mas possui uma class JsonDataWriter bastante poderosa que pode gravar arquivos Json no mesmo tipo de comportamento de um .NET Binary ou StreamWriter. O JsonDataWriter da biblioteca Tiferix.Json também tem a capacidade de auto-identificar seus arquivos Json, o que é um recurso muito útil que eu não vi em nenhuma outra biblioteca Json, incluindo Json.Net.

Se você estiver interessado, pode ver o projeto Tiferix.Json na minha página do Github e baixar as bibliotecas e dlls. O Tiferix.Json oferece uma alternativa muito mais simples e leve à biblioteca Json.Net mais abrangente e também é menos rígido e fácil de usar (na minha opinião) do que as classs nativas .Net Json.

Biblioteca Tiferix Json