36 Stimmen

Fehler beim Konvertieren von JSON in ein .Net-Objekt in asp.net

Ich kann den JSON-String nicht in ein .NET-Objekt in ASP.NET konvertieren. Ich sende den JSON-String vom Client zum Server mit einem Hidden Field (indem ich das JSON-Objekt.ToString() im Hidden Field behalte und den Wert im Code-Behind-File des Hidden Fields lese)

JSON-String/Objekt:

 [[{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}],
[{"OfferId":"1","OrderValue":"99","HostingTypeID":"6"}],
[{"OfferId":"1","OrderValue":"10","HostingTypeID":"8"}]]

.NET-Objekt

public class JsonFeaturedOffer
{
    public string OfferId { get; set; }

    public string OrderValue { get; set; }

    public string HostingTypeID { get; set; }
}

Konvertierungscode im Code-Behind-File

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value);
        MemoryStream stream = new MemoryStream(byteArray);
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer));
        object result= serializer.ReadObject(stream);
        JsonFeaturedOffer jsonObj = result as JsonFeaturedOffer;

Beim Konvertieren erhalte ich folgenden Fehler:

Element 'root' aus dem Namespace '' erwartet... 'None' mit Namen '', Namespace '' angetroffen.

82voto

Piotr Szmyd Punkte 13351

Leider lösen keine der vorgeschlagenen Lösungen die eigentliche Ursache des Problems. Diese Ausnahme bedeutet, dass Ihr Deserialisierer versucht, am Ende eines Streams zu lesen.

Die Lösung besteht darin, den Stream zurückzuspulen, das heißt, den stream.Position = 0; vor der Deserialisierung einzustellen.

Außerdem, wie in den Kommentaren erwähnt, wenn Sie einen StreamWriter verwendet haben, müssen Sie ihn vor der Verwendung des Streams flushen.

34voto

ntziolis Punkte 10011

Anstatt dies manuell zu machen, würde ich empfehlen, den eingebauten leichten JavaScriptSerializer zu verwenden. Auf den Klassen, die Sie serialisieren/deserialisieren möchten, sind keine Attribute erforderlich.

Es ist auch flexibler und schneller als der DataContractJsonSerializer, da es sich nicht um all diese wcf-Dinge kümmern muss. Darüber hinaus verfügt es über generische Überladungen, die es sehr einfach zu bedienen machen UND es kann auch anonyme Typen verarbeiten.

Serialisierung:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var objectAsJsonString = serializer.Serialize(objectToSerialize);

Deserialisierung:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
JsonFeaturedOffer deserializedObject = serializer.Deserialize(s_JsonBaseDate);

Um es noch einfacher zu machen, können Sie Erweiterungsmethoden erstellen, die Ihnen die JSON-Serialisierung/Deserialisierung direkt auf den Objekten/Zeichenfolgen geben.

3voto

amelvin Punkte 8819

Wenn Sie möchten, dass die Klasse automatisch in JSON/XML serialisiert oder in das Objekt deserialisiert wird, müssen Sie sie mit einigen serialisierbaren Attributen dekorieren:

[Serializable, XmlRoot("JsonFeaturedOffer"), DataContract(Name="JsonFeaturedOffer")]
public class JsonFeaturedOffer  
{
    [XmlElement ("OfferId"), DataMember(Name="OfferId")]
    public string OfferId {get; set;}

... und so weiter

2voto

Nick Gotch Punkte 8889

Wenn es sich um ein Array von Arrays von JsonFeaturedOffers handelt, sollte es nicht so sein:

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value);
MemoryStream stream = new MemoryStream(byteArray);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer[][]));
object result= serializer.ReadObject(stream);
JsonFeaturedOffer[][] jsonObj = result as JsonFeaturedOffer[][];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X