Для некоторых моих модульных тестов мне нужна возможность создавать определенные значения 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";
Ответы:
Ну как насчет:
dynamic jsonObject = new JObject(); jsonObject.Date = DateTime.Now; jsonObject.Album = "Me Against the world"; jsonObject.Year = 1995; jsonObject.Artist = "2Pac";
источник
dynamic
.dynamic jsonExpando = new ExpandoObject();
и добавить строку после вашего кода:JObject jsonObject = JObject.FromObject(jsonExpando);
jsonObject.list = JToken.FromObject(mylist);
.Вы можете использовать
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 для сериализации
источник
JObject.FromObject
, не сработает, если есть свойства со спецсимволами вроде-
.Ни
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 } } } };
источник
Есть некоторые среды, в которых вы не можете использовать динамические (например, 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
источник
Простой способ создания 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"}
источник
Рано или поздно у вас появится недвижимость с особым характером. Вы можете использовать индекс или комбинацию индекса и свойства.
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
источник
Вы можете использовать библиотеку 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 );
источник