[C#] JSON in C # dynamisches Objekt deserialisieren?


Answers

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;

Auch using 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;

Dokumentation: JSON mit dynamic abfragen

Question

Gibt es eine Möglichkeit, JSON-Inhalt in einem dynamischen C # 4-Typ zu deserialisieren? Es wäre schön, ein paar Klassen zu überspringen, um den DataContractJsonSerializer zu verwenden.







Die Deserialisierung in JSON.NET kann dynamisch mithilfe der JObject Klasse erfolgen, die in dieser Bibliothek enthalten ist. Meine JSON-Zeichenfolge repräsentiert diese Klassen:

public class Foo {
   public int Age {get;set;}
   public Bar Bar {get;set;}
}

public class Bar {
   public DateTime BDay {get;set;}
}

Jetzt deserialisieren wir die Zeichenfolge OHNE Referenzierung der oben genannten Klassen:

var dyn = JsonConvert.DeserializeObject<JObject>(jsonAsFooString);

JProperty propAge = dyn.Properties().FirstOrDefault(i=>i.Name == "Age");
if(propAge != null) {
    int age = int.Parse(propAge.Value.ToString());
    Console.WriteLine("age=" + age);
}

//or as a one-liner:
int myage = int.Parse(dyn.Properties().First(i=>i.Name == "Age").Value.ToString());

Oder wenn du tiefer gehen willst:

var propBar = dyn.Properties().FirstOrDefault(i=>i.Name == "Bar");
if(propBar != null) {
    JObject o = (JObject)propBar.First();
    var propBDay = o.Properties().FirstOrDefault (i => i.Name=="BDay");
    if(propBDay != null) {
        DateTime bday = DateTime.Parse(propBDay.Value.ToString());
        Console.WriteLine("birthday=" + bday.ToString("MM/dd/yyyy"));
    }
}

//or as a one-liner:
DateTime mybday = DateTime.Parse(((JObject)dyn.Properties().First(i=>i.Name == "Bar").First()).Properties().First(i=>i.Name == "BDay").Value.ToString());

Siehe post für ein vollständiges Beispiel.




Ein anderer Weg mit Newtonsoft.Json :

dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;



JsonFx kann JSON in dynamische Objekte deserialisieren.

https://github.com/jsonfx/jsonfx

Serialisierung zu / von dynamischen Typen (Standard für .NET 4.0):

var reader = new JsonReader(); var writer = new JsonWriter();

string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";
dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}



So erhalten Sie ein ExpandoObject:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

Container container = JsonConvert.Deserialize<Container>(jsonAsString, new ExpandoObjectConverter());



.Net 4.0 hat eine eingebaute Bibliothek, um dies zu tun:

using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
var d=jss.Deserialize<dynamic>(str);

Dies ist der einfachste Weg.




Es gibt eine einfache json-Bibliothek für C # namens SimpleJson, die unter http://simplejson.codeplex.com https://github.com/facebook-csharp-sdk/simple-json

Es unterstützt .net 3.5+, Silverlight und Windows Phone 7.

Unterstützt dynamische für. Net 4.0

Kann auch als kleines Paket installiert werden

Install-Package SimpleJson



Sie können using Newtonsoft.Json

var jRoot = 
 JsonConvert.DeserializeObject<dynamic>(Encoding.UTF8.GetString(resolvedEvent.Event.Data));

resolvedEvent.Event.Data ist meine Antwort, die ich vom Aufruf des core Event bekomme.




Sie können den JavaScriptSerializer erweitern, um das erstellte Wörterbuch rekursiv in expando-Objekte zu kopieren und dann dynamisch zu verwenden:

static class JavaScriptSerializerExtensions
{
    public static dynamic DeserializeDynamic(this JavaScriptSerializer serializer, string value)
    {
        var dictionary = serializer.Deserialize<IDictionary<string, object>>(value);
        return GetExpando(dictionary);
    }

    private static ExpandoObject GetExpando(IDictionary<string, object> dictionary)
    {
        var expando = (IDictionary<string, object>)new ExpandoObject();

        foreach (var item in dictionary)
        {
            var innerDictionary = item.Value as IDictionary<string, object>;
            if (innerDictionary != null)
            {
                expando.Add(item.Key, GetExpando(innerDictionary));
            }
            else
            {
                expando.Add(item.Key, item.Value);
            }
        }

        return (ExpandoObject)expando;
    }
}

Dann brauchen Sie nur eine using-Anweisung für den Namespace, in dem Sie die Erweiterung definiert haben (denken Sie nur daran, sie in System.Web.Script.Serialization zu definieren ... ein weiterer Trick besteht darin, keinen Namespace zu verwenden, dann brauchen Sie die Verwendung nicht Aussage überhaupt) und du kannst sie so konsumieren:

var serializer = new JavaScriptSerializer();
var value = serializer.DeserializeDynamic("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

var name = (string)value.Name; // Jon Smith
var age = (int)value.Age;      // 42

var address = value.Address;
var city = (string)address.City;   // New York
var state = (string)address.State; // NY



Ich verwende so in meinem Code und es funktioniert gut

using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);





Links