使用JObject动态创建JSON

fruv7luv  于 2023-02-20  发布在  其他
关注(0)|答案(8)|浏览(262)

对于我的一些单元测试,我希望能够构建特定的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");

这很好用,但是我从来没有真正喜欢过"magic string"语法,我更喜欢JavaScript中更接近expando-property语法的语法,如下所示:

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

6psbrbz91#

好吧,不如这样:

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

cbwuti442#

您可以使用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 documentation for serialization

jtw3ybtb

jtw3ybtb3#

当JSON属性不是有效的C#变量名时,dynamicJObject.FromObject解决方案都不起作用,例如"@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 }
        }
    }
};
cig3rfwq

cig3rfwq4#

在某些环境中,您不能使用动态(例如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

2w3rbyxf

2w3rbyxf5#

迟早你会有一个特殊字符的属性。例如,创建日期。连字符将不允许在属性名称。这将打破你的代码。在这种情况下,你可以使用索引或索引和属性的组合。

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
7bsow1i6

7bsow1i66#

从属性创建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"}
jgzswidk

jgzswidk7#

我建议您将nameof表达式与您要构建的结构的模型结合起来使用,您觉得怎么样?
示例:

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()表达式返回的值。

xtfmy6hx

xtfmy6hx8#

您可以使用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 );

相关问题