json.net newtonsoft - Wie kann ich JSON mit C#analysieren?




serialize jsonconvert.deserializeobject (9)

Ich habe den folgenden Code:

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

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


Answers

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

Hier ist ein Ausschnitt von dieser Seite:

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

Das letzte Console.WriteLine ist ziemlich süß ...


Probieren Sie den folgenden Code aus:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");

            JArray array = new JArray();
            using (var twitpicResponse = (HttpWebResponse)request.GetResponse())
            {

                using (var reader = new StreamReader(twitpicResponse.GetResponseStream()))
                {
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    var objText = reader.ReadToEnd();

                    JObject joResponse = JObject.Parse(objText);
                    JObject result = (JObject)joResponse["result"];
                    array = (JArray)result["Detail"];
                    string statu = array[0]["dlrStat"].ToString();
                }

            }

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

Es hat die folgenden Eigenschaften:

  1. LINQ zu JSON
  2. Der JsonSerializer zum schnellen Konvertieren von .NET-Objekten in JSON und zurück
  3. Json.NET kann optional ein gut formatiertes, eingerücktes JSON zum Debuggen oder zur Anzeige erzeugen
  4. Attribute wie JsonIgnore und JsonProperty können zu einer Klasse hinzugefügt werden, um anzupassen, wie eine Klasse serialisiert wird
  5. Möglichkeit, JSON zu und von XML zu konvertieren
  6. Unterstützt mehrere Plattformen: .NET, Silverlight und das Compact Framework

Schauen Sie sich das example unten an. In diesem Beispiel wird die example Klasse zum Konvertieren eines Objekts in und aus JSON verwendet. Es hat zwei statische Methoden für diesen Zweck. Sie sind SerializeObject(Object obj) und DeserializeObject<T>(String 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);

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

Weitere Informationen zu System.Web.Helpers.Json Sie unter dem Link.

Update : Heutzutage ist der einfachste Weg, den Web.Helpers zu bekommen, das NuGet-Paket zu verwenden .

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

// 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());

Wie wurde hier beantwortet - 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;

Eine andere native Lösung, die keine Bibliotheken von Drittanbietern, aber einen Verweis auf System.Web.Extensions erfordert, ist der JavaScriptSerializer. Dies ist seit 3.5 kein neues, aber ein sehr unbekanntes eingebautes Feature.

using System.Web.Script.Serialization;

..

JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());

und zurück

MyObject o = serializer.Deserialize<MyObject>(objectString)

var result = controller.ActioName(objParams);
IDictionary<string, object> data = (IDictionary<string, object>)new System.Web.Routing.RouteValueDictionary(result.Data);
Assert.AreEqual("Table already exists.", data["Message"]);

Folgendes von der msdn Site sollte meiner Meinung nach helfen, eine native Funktionalität für das zu bieten, wonach Sie suchen. Bitte beachten Sie, dass es für Windows 8 angegeben ist. Ein solches Beispiel von der Website ist unten aufgeführt.

JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");

Es verwendet den Windows.Data.Json Namespace.


data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))






c# json json.net deserialization