Создание JSON на лету с JObject

96

Для некоторых моих модульных тестов мне нужна возможность создавать определенные значения 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

Ответы:

143

Ну как насчет:

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 должен быть отмечен как правильный ответ. Спасибо.
Thomas
1
Думаю JObject.FromObject, не сработает, если есть свойства со спецсимволами вроде -.
Джатин Сангхви
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
PAS
источник
Как это отвечает на вопрос?
Enigmativity
@Enigmativity, Я хочу сказать, что вы можете использовать нотацию индекса и нотацию свойств вместе. т.е. obj [x] = x1; obj.y = y1 можно использовать в том же коде. Сочетание динамического ключевого слова и индексной нотации отвечает на вопросы. Ни в одном другом ответе об этом не упоминается. Возможно, это должен быть комментарий, чем ответ.
PAS
Я просто думаю, что вопрос в том, чтобы не использовать волшебные строки, но этот ответ дает ему это.
Enigmativity
@Enigmativity, ключевое слово dynamic просто обманывает компилятор. Так что это ничем не отличается от произвольной строки. объект динамического типа не является строго типизированным. Это просто синтаксический сахар. Если у базового объекта нет свойства, он потерпит неудачу во время выполнения. но вы просто не можете использовать свойства, если имя свойства содержит специальные символы, например 99BottlesOfBeer, namespace, It's-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
Микки Перлштейн,