对于我的一些单元测试,我希望能够构建特定的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中expando属性语法的东西,比如
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";
您可以使用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文档
当JSON属性不是有效的C#变量名(例如"@odata.etag"
)时,dynamic
和JObject.FromObject
解决方案都不起作用。在我的测试用例中,我更喜欢索引器初始值设定项语法:
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
您迟早会有一个带有特殊字符的属性。例如创建日期。属性名称中不允许使用连字符。这将破坏您的代码。在这种情况下,您可以使用索引,也可以使用索引和属性的组合。
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
从Properties创建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"}
您可以将表达式的名称与要构建的结构的模型结合使用。
示例:
record RecordAlbum(string Album, string Artist, int Year);
var jsonObject = new JObject
{
{ nameof(RecordAlbum.Album), "Me Against The World" },
{ nameof(RecordAlbum.Artist), "2Pac" },
{ nameof(RecordAlbum.Year), 1995 }
};
作为去除";魔术串";方面-这也会给你一点重构能力。您可以很容易地为record
重命名任何给定的属性名称,并且它应该更新nameof()
表达式返回的值。
您可以使用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 );