JSON im laufenden Betrieb mit JObject erstellen


89

Für einige meiner Komponententests möchte ich die Möglichkeit haben, bestimmte JSON-Werte (in diesem Fall Alben aufnehmen) zu erstellen, die als Eingabe für das zu testende System verwendet werden können.

Ich habe folgenden Code:

var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");

Dies funktioniert gut, aber ich habe die Syntax "Magic String" nie wirklich gemocht und würde etwas bevorzugen, das der Syntax der expando-Eigenschaft in JavaScript näher kommt:

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

4
Sie sollten doppelte Punkte für die Künstler- / Albumauswahl erhalten!
Spottedmahn

Antworten:


136

Wie wäre es mit:

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

3
Perfekt! Genau das, wonach ich gesucht habe, völlig vergessen dynamic.
Karl Anderson

Ich erhalte die Meldung 'Newtonsoft.Json.Linq.JObject' enthält keine Definition für den Fehler 'Datum', wenn ich versuche, Ihren Code auszuführen. Die Art und Weise, wie ich es zum dynamic jsonExpando = new ExpandoObject();JObject jsonObject = JObject.FromObject(jsonExpando);
Laufen bringen

3
Wenn Sie Ihrem Json-Objekt eine Liste <> hinzufügen möchten, müssen Sie Folgendes tun jsonObject.list = JToken.FromObject(mylist);.
Steve Smith

Sie können eine Kombination aus Index- und Eigenschaftsnotation verwenden, wenn Sie einen Feldnamen mit einem Sonderzeichen treffen, z. B. Create-Year ". Sie können jsonObject.Create-Year = 1995 nicht schreiben, können jedoch Folgendes verwenden. JsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

Sie können die JObject.ParseOperation verwenden und einfach einen durch einfache Anführungszeichen getrennten JSON-Text angeben.

JObject  o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

Dies hat den schönen Vorteil, dass es tatsächlich JSON ist und daher als JSON gelesen wird.

Oder Sie haben dynamische Testdaten, mit denen Sie die JObject.FromObjectOperation verwenden und ein Inline-Objekt bereitstellen können.

JObject o = JObject.FromObject(new
{
    channel = new
    {
        title = "James Newton-King",
        link = "http://james.newtonking.com",
        description = "James Newton-King's blog.",
        item =
            from p in posts
            orderby p.Title
            select new
            {
                title = p.Title,
                description = p.Description,
                link = p.Link,
                category = p.Categories
            }
    }
});

Json.net-Dokumentation zur Serialisierung


10
JObject.FromObject sollte als die richtige Antwort markiert sein. Vielen Dank.
Thomas

1
Ich denke, JObject.FromObjectwird nicht funktionieren, wenn es Eigenschaften mit Sonderzeichen wie gibt -.
Jatin Sanghvi

36

Weder dynamicnoch eine JObject.FromObjectLösung funktioniert, wenn Sie JSON-Eigenschaften haben, die keine gültigen C # -Variablennamen sind, z "@odata.etag". Ich bevorzuge die Indexer-Initialisierer-Syntax in meinen Testfällen:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = "2Pac"
};

Durch einen separaten Satz einschließender Symbole zum Initialisieren JObjectund Hinzufügen von Eigenschaften sind die Indexinitialisierer besser lesbar als klassische Objektinitialisierer, insbesondere bei zusammengesetzten JSON-Objekten wie folgt:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = new JObject
    {
        ["Name"] = "2Pac",
        ["Age"] = 28
    }
};

Mit der Objektinitialisierungssyntax wäre die obige Initialisierung:

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};

2
Die letzte ist definitiv die beste Syntax, um json in c # zu schreiben.
Anthony Brenelière

Siehe stackoverflow.com/questions/51015036/…, wie dies auch mit Sammlungen gemacht werden kann
kofifus

29

Es gibt Umgebungen, in denen Sie keine dynamischen Funktionen verwenden können (z. B. Xamarin.iOS), oder Fälle, in denen Sie nur nach einer Alternative zu den zuvor gültigen Antworten suchen.

In diesen Fällen können Sie Folgendes tun:

using Newtonsoft.Json.Linq;

JObject jsonObject =
     new JObject(
             new JProperty("Date", DateTime.Now),
             new JProperty("Album", "Me Against The World"),
             new JProperty("Year", "James 2Pac-King's blog."),
             new JProperty("Artist", "2Pac")
         )

Weitere Dokumentation hier: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

Einfache Möglichkeit, newtonsoft JObject aus Eigenschaften zu erstellen.

Dies ist ein Beispiel für Benutzereigenschaften

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}

und ich möchte diese Eigenschaft in newtonsoft JObject ist:

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});

Die Ausgabe sieht folgendermaßen aus:

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}

2

Früher oder später haben Sie Eigentum mit besonderem Charakter. Sie können entweder den Index oder eine Kombination aus Index und Eigenschaft verwenden.

dynamic jsonObject = new JObject();
jsonObject["Create-Date"] = DateTime.Now; //<-Index use
jsonObject.Album = "Me Against the world"; //<- Property use
jsonObject["Create-Year"] = 1995; //<-Index use
jsonObject.Artist = "2Pac"; //<-Property use

Wie beantwortet dies die Frage?
Rätselhaftigkeit

@Enigmativity, Der Punkt, den ich mache, ist, dass Sie Indexnotation und Eigenschaftsnotation zusammen verwenden können. dh obj [x] = x1; obj.y = y1 kann im selben Code verwendet werden. Die Kombination aus dynamischer Schlüsselwort- und Indexnotation beantwortet die Fragen. Keine andere Antwort hat dies erwähnt. Möglicherweise sollte dies ein Kommentar als eine Antwort sein.
PAS

Ich denke nur, dass es bei der Frage darum geht, keine magischen Saiten zu verwenden, aber diese Antwort gibt ihm das.
Rätselhaftigkeit

@Enigmativity, dynamisches Schlüsselwort täuscht nur den Compiler. Es ist also nicht anders als eine beliebige Zeichenfolge. Objekt vom dynmaischen Typ ist nicht stark typisiert. Es ist nur ein syntaktischer Zucker. Wenn das zugrunde liegende Objekt keine Eigenschaft hat, ist die Laufzeit fehlgeschlagen. Sie können jedoch keine Eigenschaften verwenden, wenn der Name der Eigenschaft Sonderzeichen enthält, z. B. 99BottlesOfBeer, Namespace, It's-All-Over. In diesen Fällen können wir also indizierte Eigenschaften verwenden. Andere Antworten lassen Sie denken, dass es das eine oder andere ist, aber Sie können Eigenschaft und Index mischen und abgleichen.
PAS

-3

Sie können die Newtonsoft-Bibliothek wie folgt verwenden

using Newtonsoft.Json;



public class jb
{
     public DateTime Date { set; get; }
     public string Artist { set; get; }
     public int Year { set; get; }
     public string album { set; get; }

}
var jsonObject = new jb();

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";


System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
         new System.Web.Script.Serialization.JavaScriptSerializer();

string sJSON = oSerializer.Serialize(jsonObject );

5
Sie verwenden die Bibliothek NewtonSoft hier nicht wirklich
Mickey Perlstein
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.