webentwicklung-frage-antwort-db.com.de

Wie kann ich JSON ohne JSON.NET-Bibliothek analysieren?

Ich versuche, eine Metro-Anwendung für Windows 8 unter Visual Studio 2011 zu erstellen. Dabei treten einige Probleme beim Parsen von JSON ohne JSON.NET Auf. Bibliothek (Unterstützt die Metro-Anwendungen noch nicht).

Wie auch immer, ich möchte Folgendes analysieren:

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

Sie können die im System.Json Namespace enthaltenen Klassen verwenden, die in .NET 4.5 hinzugefügt wurden. Sie müssen einen Verweis auf die System.Runtime.Serialization Assembly hinzufügen

Die JsonValue.Parse () -Methode analysiert JSON-Text und gibt ein JsonValue zurück:

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

Wenn Sie eine Zeichenfolge mit einem JSON-Objekt übergeben, sollten Sie den Wert in ein JsonObject umwandeln können:

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"]);

Die Klassen sind denen im System.Xml.Linq Namespace sehr ähnlich.

92
dtb

Ich benutze dies ... habe aber noch nie eine Metro-App entwickelt, daher kenne ich keine Einschränkungen für Bibliotheken, die Ihnen zur Verfügung stehen. (Beachten Sie, dass Sie Ihre Klassen mit den Attributen DataContract und DataMember kennzeichnen müssen.)

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

Also, wenn Sie eine Klasse wie diese hatten ...

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

}

Dann würden Sie es so verwenden ...

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

Für diejenigen, die nicht über 4.5 verfügen, hier ist meine Bibliotheksfunktion, die json liest. Es erfordert einen Projektverweis auf System.Web.Extensions.

using System.Web.Script.Serialization;

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

Normalerweise wird json aufgrund eines Vertrages ausgeschrieben. Dieser Vertrag kann und wird normalerweise in einer Klasse (T) kodifiziert. Manchmal können Sie ein Wort aus dem json nehmen und den Objektbrowser durchsuchen, um diesen Typ zu finden.

Anwendungsbeispiel:

Angesichts der Json

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

Sie könnten es in ein RadComboBoxClientState -Objekt wie dieses zerlegen:

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

Haben Sie versucht, JavaScriptSerializer zu verwenden? Es gibt auch DataContractJsonSerializer

6
YS.

Sie können DataContractJsonSerializer verwenden. Siehe dazu link für mehr Details.

1
TheBoyan

Ich habe eine .NET-Bibliothek mit dem Namen Tiferix.Json veröffentlicht, mit der Sie Json-Dateien für ADO.Net DataSet- und DataTable-Objekte serialisieren und deserialisieren können. Dieses Projekt ist in Arbeit und in den nächsten 6 Monaten (hoffentlich) werde ich die Funktionalität erweitern, um die Serialisierung verschiedener Arten von .Net-Klassen und -Objekten zu ermöglichen, einschließlich dynamischer Klassen und anonymer Typen. Derzeit verfügt die Tiferix.Json-Bibliothek nicht über einen unformatierten JsonDataReader, sondern über eine recht leistungsstarke JsonDataWriter-Klasse, mit der Json-Dateien auf die gleiche Art und Weise wie .NET Binary oder StreamWriter geschrieben werden können. Der JsonDataWriter der Tiferix.Json-Bibliothek kann auch Ihre Json-Dateien automatisch identifizieren. Dies ist eine sehr nützliche Funktion, die ich in keiner anderen Json-Bibliothek, einschließlich Json.Net, gesehen habe.

Wenn Sie interessiert sind, können Sie das Tiferix.Json-Projekt auf meiner Github-Seite anzeigen und die Bibliotheken und DLLs herunterladen. Der Tiferix.Json bietet eine viel einfachere und leichtere Alternative zur umfassenderen Json.Net-Bibliothek und ist (meiner Meinung nach) auch weniger stabil und benutzerfreundlicher als die nativen .Net Json-Klassen.

Tiferix Json Library

0
Jonathan Tiefer