JObject ile anında JSON oluşturma


96

Birim testlerimden bazıları için, test edilen sistem için girdi olarak kullanılabilecek belirli JSON değerlerini (bu durumda albümleri kaydetme) oluşturma yeteneğini istiyorum.

Takip koduna sahibim:

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

Bu iyi çalışıyor, ancak "sihirli dizge" sözdizimini hiç sevmedim ve JavaScript'teki expando-özelliği sözdizimine aşağıdaki gibi daha yakın bir şeyi tercih ederim:

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

5
Sanatçı / albüm seçimi için çift puan almalısınız!
08'de spottedmahn

Yanıtlar:


143

Peki ya:

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

3
Mükemmel! Tam olarak aradığım şeyi tamamen unuttum dynamic.
Karl Anderson

Kodunuzu çalıştırmayı denediğimde 'Newtonsoft.Json.Linq.JObject' hatası 'Tarih' hatası için bir tanım içermiyor. dynamic jsonExpando = new ExpandoObject();JObject jsonObject = JObject.FromObject(jsonExpando);
Çalışmasını sağlamamın

3
Json nesnenize bir Liste <> eklemek istiyorsanız, buna benzer bir şey yapmanız gerekir jsonObject.list = JToken.FromObject(mylist);.
Steve Smith

Özel karaktere sahip alan ismine, örneğin Create-Year'a basarsanız, indeks ve özellik gösterimi kombinasyonunu kullanabilirsiniz. JsonObject.Create-Year = 1995 yazamazsınız, ancak aşağıdakini kullanabilirsiniz. JsonObject ["Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

JObject.Parseİşlemi kullanabilir ve tek tırnakla ayrılmış JSON metni sağlayabilirsiniz.

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

Bunun aslında JSON olmanın güzel yararı var ve bu yüzden JSON olarak okuyor.

Veya dinamik olan test verileriniz var, JObject.FromObjectişlemi kullanabilir ve bir satır içi nesne sağlayabilirsiniz.

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

Serileştirme için Json.net belgeleri


10
JObject.FromObject doğru cevap olarak işaretlenmelidir. Teşekkürler.
Thomas

1
JObject.FromObjectGibi özel karakterlere sahip özellikler varsa işe yaramayacağını düşünüyorum -.
Jatin Sanghvi

39

Ne dynamic, ne de JObject.FromObjectçözüm , geçerli C # değişken adları olmayan JSON özelliklerine sahip olduğunuzda çalışmaz "@odata.etag". Test durumlarımda indeksleyici başlatıcı sözdizimini tercih ederim:

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

Başlatma JObjectve ona özellikler eklemek için ayrı bir kapalı semboller kümesine sahip olmak , dizin başlatıcılarını klasik nesne başlatıcılardan daha okunaklı hale getirir, özellikle aşağıdaki gibi bileşik JSON nesneleri durumunda:

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

Nesne başlatıcı sözdizimi ile, yukarıdaki başlatma şöyle olacaktır:

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

2
Sonuncusu, c # ile json yazmak için kesinlikle en iyi sözdizimidir.
Anthony Brenelière

Bunun koleksiyonlarla nasıl yapılacağını öğrenmek için stackoverflow.com/questions/51015036/… sayfasına bakın
kofifus

30

Dinamik kullanamayacağınız (örn. Xamarin.iOS) veya önceki geçerli cevaplara bir alternatif aradığınız durumlar vardır.

Bu durumlarda şunları yapabilirsiniz:

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

Daha fazla belge burada: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

Özellikler'den newtonsoft JObject oluşturmanın basit yolu.

Bu bir Örnek Kullanıcı Özellikleri

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

ve bu özelliği newtonsoft JObject'te istiyorum:

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

Çıktı şöyle olacaktır:

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

2

Er ya da geç özel karaktere sahip bir mülkünüz olacak. Dizini veya dizin ve özellik kombinasyonunu kullanabilirsiniz.

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

Bu soruya nasıl cevap veriyor?
Enigmativity

@Enigmativity, Yaptığım nokta, indeks gösterimi ve özellik gösterimini birlikte kullanabilirsiniz. yani obj [x] = x1; obj.y = y1 aynı kodda kullanılabilir. Dinamik anahtar kelime ve dizin gösteriminin kombinasyonu soruları yanıtlar. Başka hiçbir cevap bundan bahsetmiyor. Muhtemelen, bu bir cevaptan çok yorum olmalıdır.
PAS

Bence soru sihirli ipleri kullanmamakla ilgili, ama bu cevap ona bunu veriyor.
Enigmativity

@Enigmativity, dinamik anahtar sözcük derleyiciyi kandırır. Yani keyfi dizeden farklı değil. dinamik türdeki nesne güçlü bir şekilde yazılmamıştır. Bu sadece sözdizimsel bir şeker. Temel alınan nesnenin özelliği yoksa, çalışma zamanında başarısız olur. ancak özellik adı özel karakterler içeriyorsa, yalnızca özellikleri kullanamazsınız, örneğin 99BottlesOfBeer, namespace, It's-All-Over. Yani bu durumlarda, indekslenmiş özellikleri kullanabiliriz. Diğer cevaplar bunun biri veya diğeri olduğunu düşünmenizi sağlar, ancak özelliği ve dizini karıştırıp eşleştirebilirsiniz.
PAS

-3

Newtonsoft kütüphanesini kullanabilir ve aşağıdaki gibi kullanabilirsiniz

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
aslında burada newtonsoft kitaplığını kullanmıyorsunuz
Mickey Perlstein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.