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";
Karl Anderson
quelle
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";
Dimitar Dimitrov
quelle
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

Lee Jensen
quelle
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 }
        }
    }
};
Jatin Sanghvi
quelle
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

Daniele D.
quelle
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"}
Manjunath Bilwar
quelle
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
PAS
quelle
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 );
Nirmal
quelle
5
Sie verwenden die Bibliothek NewtonSoft hier nicht wirklich
Mickey Perlstein