使用JObject即时创建JSON


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中的expando-property语法:

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

5
您应该为艺术家/专辑选择获得双倍积分!
spottedmahn

Answers:


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如果存在带有特殊字符的属性,则不会起作用-
贾廷·桑格维

39

无论是dynamic,还是JObject.FromObject当你有没有有效的C#变量名如JSON性能解决方案的工作"@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
最后一种绝对是用c#编写json的最佳语法。
AnthonyBrenelière,

参见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

从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"}

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,dynamic关键字愚弄了编译器。因此,它与任意字符串没有什么不同。动态类型的对象不是强类型的。这只是一种语法糖。如果基础对象没有属性,它将使运行时失败。但是,如果属性名称包含特殊字符,例如99BottlesOfBeer,名称空间,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
Mickey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.