85 votes

Comment parser JSON sans JSON.NET bibliothèque?

Je suis en train de construire une application Metro pour Windows 8 sur Visual Studio 2011. et alors que je suis en train de le faire, je vais avoir quelques questions sur comment analyser JSON sans JSON.NET bibliothèque (Il ne prend pas en charge le métro applications).

De toute façon, je veux analyser ce:

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

102voto

dtb Points 104373

Vous pouvez utiliser les classes trouvées dans le Système.Json de Noms qui ont été ajoutés .NET 4.5.

Le JsonValue.Méthode Parse() analyse JSON texte et renvoie un JsonValue:

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

Si vous passez une chaîne avec un objet JSON, vous devriez être en mesure de convertir la valeur d'un JsonObject:

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 semblables à ceux trouvés dans le Système.Xml.Linq Espace De Noms.

40voto

ctorx Points 2684

Je l'utiliser...mais n'avez jamais fait de toute métro de développement d'applications, donc je ne connais pas de restrictions sur les bibliothèques offrent à vous. (notez que vous aurez besoin de marquer vos classes 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 avez eu une classe comme ça...

[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 que vous pouvez l'utiliser 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);

6voto

YS. Points 983

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

1voto

Bojan Skrchevski Points 3908

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X