Membuat JSON dengan cepat dengan JObject

96

Untuk beberapa pengujian unit saya, saya ingin kemampuan untuk membangun nilai JSON tertentu (merekam album dalam kasus ini) yang dapat digunakan sebagai input untuk sistem yang diuji.

Saya memiliki kode berikut:

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

Ini berfungsi dengan baik, tetapi saya tidak pernah benar-benar menyukai sintaks "string ajaib" dan lebih suka sesuatu yang lebih dekat dengan sintaks properti-perluasan dalam JavaScript seperti ini:

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Karl Anderson
sumber
5
Anda harus mendapatkan poin ganda untuk pemilihan artis / album!
spottedmahn

Jawaban:

143

Nah, bagaimana kalau:

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Dimitar Dimitrov
sumber
3
Sempurna! Persis apa yang saya cari, benar-benar lupa dynamic.
Karl Anderson
Saya mendapatkan 'Newtonsoft.Json.Linq.JObject' tidak berisi definisi untuk kesalahan 'Tanggal' ketika saya mencoba menjalankan kode Anda. Cara saya membuatnya bekerja adalah mengubah baris pertama menjadi: dynamic jsonExpando = new ExpandoObject();dan menambahkan baris setelah kode Anda:JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode
3
Jika Anda ingin menambahkan List <> ke objek Json, Anda perlu melakukan sesuatu seperti jsonObject.list = JToken.FromObject(mylist);.
Steve Smith
Anda dapat menggunakan kombinasi indeks dan notasi properti jika Anda menekan nama field yang memiliki karakter khusus misalnya Create-Year ". Anda tidak dapat menulis jsonObject.Create-Year = 1995, tetapi dapat menggunakan berikut. JsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS
71

Anda dapat menggunakan JObject.Parseoperasi ini dan cukup memberikan teks JSON yang dipisahkan tanda kutip tunggal.

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

Ini memiliki keuntungan bagus menjadi JSON sehingga terbaca sebagai JSON.

Atau Anda memiliki data uji yang dinamis, Anda dapat menggunakan JObject.FromObjectoperasi dan menyediakan objek sebaris.

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

Dokumentasi Json.net untuk serialisasi

Lee Jensen
sumber
10
JObject.FromObject harus ditandai sebagai jawaban yang benar. Terima kasih.
Thomas
1
Saya rasa JObject.FromObjecttidak akan berfungsi jika ada properti dengan karakter khusus seperti -.
Jatin Sanghvi
39

Baik dynamic, maupun JObject.FromObjectsolusi tidak berfungsi ketika Anda memiliki properti JSON yang bukan nama variabel C # yang valid misalnya "@odata.etag". Saya lebih suka sintaks penginisialisasi pengindeks dalam kasus pengujian saya:

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

Memiliki set simbol penutup terpisah untuk menginisialisasi JObjectdan untuk menambahkan properti ke dalamnya membuat penginisialisasi indeks lebih mudah dibaca daripada penginisialisasi objek klasik, terutama dalam kasus objek gabungan JSON seperti di bawah ini:

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

Dengan sintaks penginisialisasi objek, inisialisasi di atas akan menjadi:

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};
Jatin Sanghvi
sumber
2
Yang terakhir adalah sintaks terbaik untuk menulis json di c #.
Anthony Brenelière
lihat stackoverflow.com/questions/51015036/… untuk cara melakukan ini dengan koleksi juga
kofifus
30

Ada beberapa lingkungan di mana Anda tidak dapat menggunakan dinamika (misalnya Xamarin.iOS) atau kasus di mana Anda hanya mencari alternatif dari jawaban valid sebelumnya.

Dalam kasus ini, Anda dapat melakukan:

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

Dokumentasi lebih lanjut di sini: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm

Daniele D.
sumber
2

Cara sederhana untuk membuat JObject newtonsoft dari Properties.

Ini adalah Contoh Properti Pengguna

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

dan saya ingin properti ini di newtonsoft JObject adalah:

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

Outputnya akan seperti ini:

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

Cepat atau lambat Anda akan memiliki properti dengan karakter khusus. Anda dapat menggunakan indeks atau kombinasi indeks dan properti.

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
sumber
Bagaimana ini menjawab pertanyaan?
Enigmativitas
@Enigmativitas, Poin yang saya buat adalah, Anda dapat menggunakan notasi indeks dan notasi properti secara bersamaan. yaitu obj [x] = x1; obj.y = y1 dapat digunakan dalam kode yang sama. Kombinasi kata kunci dinamis dan notasi indeks menjawab pertanyaan tersebut. Tidak ada jawaban lain yang menyebutkan hal ini. Mungkin, ini lebih merupakan komentar daripada jawaban.
PAS
Saya hanya berpikir bahwa pertanyaannya adalah tentang tidak menggunakan string ajaib, tetapi jawaban ini memberinya itu.
Enigmativitas
@Enigmativitas, kata kunci dinamis hanya menipu compiler. Jadi tidak ada bedanya dengan string arbitrer. objek berjenis dynmaic tidak diketik dengan kuat. Itu hanya gula sintaksis. Jika objek yang mendasari tidak memiliki properti itu akan gagal runtime. tetapi Anda tidak dapat menggunakan properti jika nama properti berisi karakter khusus misalnya 99BottlesOfBeer, namespace, It's-All-Over. Jadi dalam kasus tersebut, kita dapat menggunakan properti yang diindeks. Jawaban lain membuat Anda berpikir bahwa itu satu atau lainnya, tetapi Anda dapat mencampur dan mencocokkan properti dan indeks.
PAS
-3

Anda dapat menggunakan perpustakaan Newtonsoft dan menggunakannya sebagai berikut

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
sumber
5
Anda sebenarnya tidak menggunakan newtonsoft perpustakaan di sini
Mickey Perlstein