Створення JSON на льоту за допомогою JObject


94

Для деяких моїх модульних тестів я хочу мати можливість створювати певні значення JSON (у цьому випадку записувати альбоми), які можна використовувати як вхідні дані для системи, що тестується.

У мене є такий код:

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

Це чудово працює, але мені ніколи не подобався синтаксис "магічного рядка", і я б віддав перевагу чомусь ближчому до синтаксису розширення властивостей у JavaScript, як це:

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

5
Ви повинні отримати подвійні бали за вибір виконавця / альбому!
spottedmahn

Відповіді:


141

Ну, а як щодо:

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

3
Ідеально! Саме те, що я шукав, зовсім забув dynamic.
Карл Андерсон,

Я отримую 'Newtonsoft.Json.Linq.JObject' не містить визначення помилки 'Дата', коли я намагаюся запустити ваш код. Я міг змусити це працювати, змінивши перший рядок на: dynamic jsonExpando = new ExpandoObject();і додавши рядок після вашого коду:JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
Якщо ви хочете додати List <> до свого об’єкта Json, вам потрібно зробити щось на зразок jsonObject.list = JToken.FromObject(mylist);.
Стів Сміт,

Ви можете використовувати комбінацію позначень індексу та властивостей, якщо ви натиснете назву поля, що має спеціальний символ, наприклад, Create-Year ". Ви не зможете написати jsonObject.Create-Year = 1995, але можете використовувати наступне. JsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

Ви можете скористатися цією JObject.Parseоперацією та просто надати текст JSON, розділений одинарними лапками.

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

Це має приємну перевагу насправді бути JSON, і тому воно читається як JSON.

Або у вас є тестові дані, які є динамічними, ви можете використовувати JObject.FromObjectоперацію та надавати вбудований об’єкт.

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 для серіалізації


10
JObject.FromObject слід позначити як правильну відповідь. Дякую.
Томас

1
Я думаю, що JObject.FromObjectце не спрацює, якщо є властивості зі спеціальними символами типу -.
Jatin Sanghvi

39

Ні те dynamic, ні інше JObject.FromObjectрішення не працює, якщо у вас є властивості JSON, які не є дійсними іменами змінних C #, наприклад "@odata.etag". Я віддаю перевагу синтаксису ініціалізатора індексатора у своїх тестових випадках:

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

Наявність окремого набору символів, що охоплюють для ініціалізації JObjectта додавання властивостей, робить ініціалізатори індексу більш читабельними, ніж класичні ініціалізатори об’єктів, особливо у випадку складених об’єктів JSON, як показано нижче:

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

З синтаксисом ініціалізатора об’єкта, наведеною вище ініціалізацією буде:

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

2
Останній - це остаточно найкращий синтаксис для написання json на c #.
Ентоні Бренельєр,

див. stackoverflow.com/questions/51015036/… про те, як це зробити і з колекціями
kofifus

30

Є деякі середовища, де ви не можете використовувати динамічні (наприклад, Xamarin.iOS), або випадки, коли ви просто шукаєте альтернативу попереднім дійсним відповідям.

У цих випадках ви можете зробити:

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

Більше документації тут: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

Простий спосіб створення newtonsoft JObject із властивостей.

Це зразок властивостей користувача

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

і я хочу, щоб ця властивість у newtonsoft JObject:

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

Результат буде таким:

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

2

Рано чи пізно ви отримаєте майно з особливим характером. Ви можете використовувати індекс або комбінацію індексу та властивості.

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

Як це відповідає на питання?
Загадковість

@Enigmativity, Я хочу сказати, що ви можете використовувати позначення індексу та позначення властивостей разом. тобто obj [x] = x1; obj.y = y1 може використовуватися в тому ж коді. Поєднання динамічного позначення ключового слова та індексу відповідає на запитання. Жодна інша відповідь не згадує про це. Можливо, це має бути коментар, а не відповідь.
PAS

Я просто думаю, що питання полягає в тому, щоб не використовувати магічні струни, але ця відповідь дає йому це.
Загадковість

@Enigmativity, динамічне ключове слово просто дурить компілятор. Тож він нічим не відрізняється від довільного рядка. об'єкт динамічного типу не набирається сильно. Це просто синтаксичний цукор. Якщо базовий об'єкт не має властивостей, це не вдасться виконати. але ви просто не можете використовувати властивості, якщо ім'я властивості містить спеціальні символи, наприклад 99BottlesOfBeer, простір імен, It-All-Over. Тож у цих випадках ми можемо використовувати індексовані властивості. Інші відповіді змушують вас думати, що це те чи інше, але ви можете поєднувати властивості та індекс.
PAS,

-3

Ви можете використовувати бібліотеку Newtonsoft і використовувати її наступним чином

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
ви насправді не користуєтесь тут бібліотекою newtonsoft
Міккі Перлштейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.