Creazione di JSON al volo con JObject


96

Per alcuni dei miei unit test desidero la possibilità di creare valori JSON particolari (album di registrazione in questo caso) che possono essere utilizzati come input per il sistema in prova.

Ho il codice seguente:

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

Funziona bene, ma non mi è mai piaciuta molto la sintassi della "stringa magica" e preferirei qualcosa di più vicino alla sintassi della proprietà expando in JavaScript come questo:

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

5
Dovresti ottenere il doppio dei punti per la selezione dell'artista / album!
spottedmahn

Risposte:


143

Bene, che ne dici di:

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

3
Perfetto! Esattamente quello che stavo cercando, completamente dimenticato dynamic.
Karl Anderson

Ottengo che "Newtonsoft.Json.Linq.JObject" non contiene una definizione per l'errore "Data" quando provo a eseguire il codice. Il modo in cui potrei farlo funzionare è cambiare la prima riga in: dynamic jsonExpando = new ExpandoObject();e aggiungere una riga dopo il codice:JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
Se vuoi aggiungere un List <> al tuo oggetto Json, devi fare qualcosa di simile jsonObject.list = JToken.FromObject(mylist);.
Steve Smith

È possibile utilizzare una combinazione di indice e notazione di proprietà nel caso in cui si prema il nome del campo con un carattere speciale, ad esempio Create-Year ". Non sarà possibile scrivere jsonObject.Create-Year = 1995, ma è possibile utilizzare il seguente. JsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

È possibile utilizzare l' JObject.Parseoperazione e fornire semplicemente un testo JSON delimitato da virgolette singole.

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

Questo ha il bel vantaggio di essere effettivamente JSON e quindi si legge come JSON.

Oppure si dispone di dati di test dinamici, è possibile utilizzare l' JObject.FromObjectoperazione e fornire un oggetto inline.

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

Documentazione Json.net per la serializzazione


10
JObject.FromObject dovrebbe essere contrassegnato come risposta corretta. Grazie.
Thomas,

1
Penso JObject.FromObjectche non funzionerà se ci sono proprietà con caratteri speciali come -.
Jatin Sanghvi

39

dynamic, né la JObject.FromObjectsoluzione funziona quando hai proprietà JSON che non sono nomi di variabili C # validi, ad es "@odata.etag". Preferisco la sintassi dell'inizializzatore dell'indicizzatore nei miei casi di test:

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

Avere un set separato di simboli di inclusione per l'inizializzazione JObjecte per l'aggiunta di proprietà rende gli inizializzatori di indice più leggibili rispetto agli inizializzatori di oggetti classici, specialmente in caso di oggetti JSON composti come di seguito:

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

Con la sintassi dell'inizializzatore di oggetti, l'inizializzazione di cui sopra sarebbe:

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

2
L'ultima è definitivamente la migliore sintassi per scrivere json in c #.
Anthony Brenelière dal

vedi stackoverflow.com/questions/51015036/… per come farlo anche con le raccolte
kofifus

30

Esistono alcuni ambienti in cui non è possibile utilizzare dinamici (ad esempio Xamarin.iOS) o casi in cui si cerca solo un'alternativa alle precedenti risposte valide.

In questi casi puoi fare:

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

Ulteriore documentazione qui: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

Modo semplice per creare newtonsoft JObject da Proprietà.

Questa è una proprietà utente di esempio

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

e voglio che questa proprietà in newtonsoft JObject sia:

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

L'output sarà così:

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

2

Prima o poi avrai proprietà con carattere speciale. È possibile utilizzare indice o una combinazione di indice e proprietà.

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

Come risponde questo alla domanda?
Enigmativity

@Enigmativity, il punto che sto dicendo è che puoi usare la notazione dell'indice e la notazione delle proprietà insieme. cioè obj [x] = x1; obj.y = y1 può essere utilizzato nello stesso codice. La combinazione di parola chiave dinamica e notazione indice risponde alle domande. Nessun'altra risposta lo ha menzionato. Forse, questo dovrebbe essere un commento piuttosto che una risposta.
PAS

Penso solo che la domanda riguardi il non usare corde magiche, ma questa risposta gli sta dando quello.
Enigmativity

@Enigmativity, la parola chiave dinamica inganna il compilatore. Quindi non è diverso dalla stringa arbitraria. oggetto di tipo dinamico non è fortemente tipizzato. È solo uno zucchero sintattico. Se l'oggetto sottostante non ha proprietà, il runtime fallirà. ma non puoi usare le proprietà se il nome della proprietà contiene caratteri speciali, ad esempio 99BottlesOfBeer, namespace, It's-All-Over. Quindi, in questi casi, possiamo usare proprietà indicizzate. Altre risposte ti fanno pensare che sia l'una o l'altra, ma puoi mescolare e abbinare proprietà e indice.
PAS

-3

Puoi usare la libreria Newtonsoft e usarla come segue

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
in realtà non stai usando la libreria newtonsoft qui
Mickey Perlstein
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.