568 Stimmen

Wie kann ich JSON mit C# deserialisieren?

Ich habe den folgenden Code:

var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);

Die Eingabe in responsecontent ist JSON, aber es wird nicht richtig in ein Objekt deserialisiert. Wie sollte ich es richtig deserialisieren?

436voto

MD Sayem Ahmed Punkte 27828

Ich nehme an, Sie verwenden nicht Json.NET (Newtonsoft.Json NuGet-Paket). Wenn dies der Fall ist, dann sollten Sie es versuchen.

Es hat die folgenden Merkmale:

  1. LINQ zu JSON
  2. Der JsonSerializer für die schnelle Konvertierung Ihrer .NET-Objekte in JSON und wieder zurück
  3. Json.NET kann optional gut formatiertes, eingerücktes JSON zur Fehlersuche oder Anzeige erzeugen.
  4. Attribute wie JsonIgnore y JsonProperty kann einer Klasse hinzugefügt werden, um die Art der Serialisierung einer Klasse anzupassen
  5. Fähigkeit zur Konvertierung von JSON in und aus XML
  6. Unterstützt mehrere Plattformen: .NET, Silverlight und das Compact Framework

Sehen Sie sich die Beispiel unten. In diesem Beispiel, JsonConvert Klasse wird zur Konvertierung eines Objekts in und aus JSON verwendet. Zu diesem Zweck verfügt sie über zwei statische Methoden. Diese sind SerializeObject(Object obj) y DeserializeObject<T>(String json) :

using Newtonsoft.Json;

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": "2008-12-28T00:00:00",
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);

372voto

Dmitry Pavlov Punkte 28068

Wie hier schon beantwortet wurde - JSON in C# dynamisches Objekt deserialisieren?

Es ist ziemlich einfach mit Json.NET:

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

Oder mit Newtonsoft.Json.Linq :

dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

158voto

qqbenq Punkte 9555

Hier sind einige Optionen ohne Verwendung von Bibliotheken von Drittanbietern:

// For that you will need to add reference to System.Runtime.Serialization
var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"), new System.Xml.XmlDictionaryReaderQuotas());

// For that you will need to add reference to System.Xml and System.Xml.Linq
var root = XElement.Load(jsonReader);
Console.WriteLine(root.XPathSelectElement("//Name").Value);
Console.WriteLine(root.XPathSelectElement("//Address/State").Value);

// For that you will need to add reference to System.Web.Helpers
dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
Console.WriteLine(json.Name);
Console.WriteLine(json.Address.State);

Unter dem Link finden Sie weitere Informationen über System.Web.Helpers.Json .

Update : Heutzutage ist der einfachste Weg, die Web.Helpers ist die Verwendung des NuGet-Paket .


Wenn Sie sich nicht um frühere Windows-Versionen kümmern, können Sie die Klassen der Windows.Data.Json Namensraum:

// minimum supported version: Win 8
JsonObject root = Windows.Data.Json.JsonValue.Parse(jsonString).GetObject();
Console.WriteLine(root["Name"].GetString());
Console.WriteLine(root["Address"].GetObject()["State"].GetString());

66voto

ElonU Webdev Punkte 2433

Wenn .NET 4 für Sie verfügbar ist, schauen Sie sich das an: http://visitmix.com/writings/the-rise-of-json (archive.org)

Hier ist ein Auszug aus dieser Website:

WebClient webClient = new WebClient();
dynamic result = JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));
Console.WriteLine(result.response.user.firstName);

Die letzte Console.WriteLine ist ziemlich gut...

53voto

haldo Punkte 11488

System.Text.Json

.NET-Kern 3.0 kommt mit System.Text.Json eingebaut, was bedeutet, dass Sie JSON deserialisieren/serialisieren können ohne unter Verwendung einer Bibliothek eines Drittanbieters.

Serialisieren/Desialisieren

So serialisieren Sie Ihre Klasse(n) als JSON-String:

var json = JsonSerializer.Serialize(model);

Zur Deserialisierung des JSON in eine stark typisierte Klasse:

var model = JsonSerializer.Deserialize<Model>(json);

Parsen (.NET 6)

Mit .NET 6 wurde die System.Text.Json.Nodes Namespace, der DOM-Parsing, Navigation und Manipulation in ähnlicher Weise wie Newtonsoft.Json ermöglicht, indem die neuen Klassen JsonObject , JsonArray , JsonValue y JsonNode .

// JsonObject parse DOM
var jsonObject = JsonNode.Parse(jsonString).AsObject();
// read data from DOM
string name = jsonObject["Name"].ToString();
DateTime date = (DateTime)jsonObject["Date"];
var people = jsonObject["People"].Deserialize<List<Person>>();

Ähnliche Methoden gelten für JsonArray . Diese Antwort bietet weitere Details zu JsonObject.


Es ist zu beachten, dass System.Text.Json nicht automatisch verarbeiten camelCase JSON-Eigenschaften bei Verwendung Ihres eigenen Codes (bei der Verwendung von MVC/WebAPI-Anfragen und dem Model Binder jedoch schon).

Um dieses Problem zu lösen, müssen Sie JsonSerializerOptions als Parameter.

JsonSerializerOptions options = new JsonSerializerOptions
{        
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,  // set camelCase       
    WriteIndented = true                                // write pretty json
};

// pass options to serializer
var json = JsonSerializer.Serialize(order, options);
// pass options to deserializer
var order = JsonSerializer.Deserialize<Order>(json, options);

System.Text.Json ist auch für .Net Framework und .Net Standard als Nu-get-Paket verfügbar System.Text.Json

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