1199 Stimmen

JSON in C# dynamisches Objekt deserialisieren?

Gibt es eine Möglichkeit, JSON-Inhalte in einen dynamischen C#-Typ zu deserialisieren? Es wäre schön, wenn man die Erstellung einer Reihe von Klassen überspringen könnte, um die DataContractJsonSerializer .

14voto

akac Punkte 161

Erstellen dynamischer Objekte mit Newtonsoft.Json funktioniert wirklich großartig.

//json is your string containing the JSON value
dynamic data = JsonConvert.DeserializeObject<dynamic>(json);

Jetzt können Sie auf die data Objekt wie ein normales Objekt. Dies ist das JSON-Objekt, das wir derzeit als Beispiel haben:

{ "ID":123,"Name":"Jack","Numbers":[1, 2, 3] }

So greifen Sie nach der Deserialisierung darauf zu:

data.ID //Retrieve the int
data.Name //Retrieve the string
data.Numbers[0] //Retrieve the first element in the array

12voto

RoJaIt Punkte 432

Ich benutze http://json2csharp.com/ um eine Klasse zu erhalten, die das JSON-Objekt repräsentiert.

Eingabe:

{
   "name":"John",
   "age":31,
   "city":"New York",
   "Childs":[
      {
         "name":"Jim",
         "age":11
      },
      {
         "name":"Tim",
         "age":9
      }
   ]
}

Ausgabe:

public class Child
{
    public string name { get; set; }
    public int age { get; set; }
}

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public string city { get; set; }
    public List<Child> Childs { get; set; }
}

Danach verwende ich Newtonsoft.Json um die Klasse zu füllen:

using Newtonsoft.Json;

namespace GitRepositoryCreator.Common
{
    class JObjects
    {
        public static string Get(object p_object)
        {
            return JsonConvert.SerializeObject(p_object);
        }
        internal static T Get<T>(string p_object)
        {
            return JsonConvert.DeserializeObject<T>(p_object);
        }
    }
}

Sie können es so nennen:

Person jsonClass = JObjects.Get<Person>(stringJson);

string stringJson = JObjects.Get(jsonClass);

PS:

Wenn der Name Ihrer JSON-Variable kein gültiger C#-Name ist (der Name beginnt mit $ ), können Sie das folgendermaßen beheben:

public class Exception
{
   [JsonProperty(PropertyName = "$id")]
   public string id { get; set; }
   public object innerException { get; set; }
   public string message { get; set; }
   public string typeName { get; set; }
   public string typeKey { get; set; }
   public int errorCode { get; set; }
   public int eventId { get; set; }
}

8voto

user1006544 Punkte 1444

Das ist der einfachste Weg:

Fügen Sie einfach Folgendes hinzu DLL-Datei .

Verwenden Sie den Code wie folgt:

dynamic json = new JDynamic("{a:'abc'}");
// json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
// json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
// json.a is

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
// And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
// And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
// json.Length/json.Count is 2.
// And you can use the  json[0].b/json[1].c to get the num.

8voto

nitsram Punkte 658

Eine weitere Möglichkeit ist "JSON als Klassen einfügen" damit es schnell und einfach deserialisiert werden kann.

  1. Kopieren Sie einfach Ihr gesamtes JSON
  2. In Visual Studio: Klicken Sie auf . EditEinfügen SpezialJSON als Klassen einfügen

Hier ist eine bessere Erklärung n piccas... JSON als Klassen einfügen" in ASP.NET und Web Tools 2012.2 RC

6voto

Ich möchte dies programmatisch in Unit-Tests zu tun, habe ich den Luxus, es heraus zu tippen.

Meine Lösung ist:

var dict = JsonConvert.DeserializeObject<ExpandoObject>(json) as IDictionary<string, object>;

Jetzt kann ich behaupten, dass

dict.ContainsKey("ExpectedProperty");

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