web-dev-qa-db-fra.com

Comment analyser JSON sans la bibliothèque JSON.NET?

J'essaie de créer une application Metro pour Windows 8 sur Visual Studio 2011. Et pendant que j'essaie de le faire, j'ai quelques problèmes pour analyser JSON sans JSON.NET bibliothèque (il ne supporte pas encore les applications de métro).

Quoi qu'il en soit, je veux analyser ceci:

{
   "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"
}
69
Eli Revah

Vous pouvez utiliser les classes trouvées dans le Espace de noms System.Json qui ont été ajoutées dans .NET 4.5. Vous devez ajouter une référence à l'assembly System.Runtime.Serialization

La méthode JsonValue.Parse () analyse le texte JSON et renvoie un JsonValue :

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

Si vous transmettez une chaîne avec un objet JSON, vous devriez pouvoir convertir la valeur en 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"]);

Les classes sont assez similaires à celles trouvées dans System.Xml.Linq Namespace .

92
dtb

J'utilise ceci ... mais je n'ai jamais fait de développement d'application de métro, donc je ne connais aucune restriction sur les bibliothèques disponibles pour vous. (notez que vous devez marquer vos classes comme avec les attributs DataContract et 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;
        }
    }
}

Donc, si vous aviez un cours comme celui-ci ...

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

}

Alors vous l'utiliseriez comme ça ...

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);
32
ctorx

Pour ceux qui n’ont pas la 4.5, voici la fonction de bibliothèque qui lit json. Il nécessite une référence de projet à System.Web.Extensions.

using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}

Habituellement, json est écrit sur la base d'un contrat. Ce contrat peut et sera généralement codifié dans une classe (T). Parfois, vous pouvez prendre un mot dans le JSON et lancer une recherche dans le navigateur d’objets pour trouver ce type.

Exemple d'utilisation:

Vu le json

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

Vous pouvez l'analyser dans un objet RadComboBoxClientState comme ceci:

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

Avez-vous essayé d'utiliser JavaScriptSerializer? Il y a aussi DataContractJsonSerializer

6
YS.

Vous pouvez utiliser DataContractJsonSerializer. Voir ceci lien pour plus de détails.

1
TheBoyan

J'ai publié une bibliothèque .NET appelée Tiferix.Json qui vous permet de sérialiser et de désérialiser les fichiers Json depuis et vers les objets ADO.Net DataSet et DataTable. Ce projet est en cours et au cours des six prochains mois (j'espère), j'élargirai les fonctionnalités pour permettre la sérialisation de divers types de classes et d'objets .Net, y compris les classes dynamiques et les types anonymes. Pour l’instant, la bibliothèque Tiferix.Json n’a pas de fichier JsonDataReader brut, mais une classe JsonDataWriter assez puissante, capable d’écrire des fichiers Json de la même manière qu’un fichier .NET Binary ou StreamWriter. Le JsonDataWriter de la bibliothèque Tiferix.Json permet également d’identifier automatiquement vos fichiers Json, ce qui est une fonctionnalité très utile que je n’ai jamais vue dans aucune autre bibliothèque Json, y compris Json.Net.

Si vous êtes intéressé, vous pouvez afficher le projet Tiferix.Json sur ma page Github et télécharger les bibliothèques et les dll. Tiferix.Json offre une alternative beaucoup plus simple et légère à la bibliothèque plus complète Json.Net et est également moins rigide et plus facile à utiliser (à mon avis) que les classes natives .Net Json.

Bibliothèque Tiferix Json

0
Jonathan Tiefer