使用JObject动态创建JSON

Kar*_*son 78 c# json json.net

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

这工作正常,但我从来没有真正喜欢"魔术字符串"语法,并希望更接近JavaScript中的expando-property语法,如下所示:

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Run Code Online (Sandbox Code Playgroud)

Dim*_*rov 121

那么,怎么样:

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Run Code Online (Sandbox Code Playgroud)

  • 现在,您拥有神奇的属性,而不是神奇的字符串:) (4认同)
  • 完善!正是我所寻找的,完全忘记了`动态'. (3认同)
  • 如果要向Json对象添加List <>,则需要执行类似`jsonObject.list = JToken.FromObject(mylist);`的操作. (3认同)

Lee*_*sen 63

您可以使用该JObject.Parse操作,只需提供单引号分隔的JSON文本.

JObject  o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");
Run Code Online (Sandbox Code Playgroud)

这实际上是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
            }
    }
});
Run Code Online (Sandbox Code Playgroud)

Json.net序列化文档

  • 应将JObject.FromObject标记为正确答案.谢谢. (9认同)

Jat*_*hvi 30

无论是dynamic,还是JObject.FromObject当你有没有有效的C#变量名如JSON性能解决方案的工作"@odata.etag".我更喜欢我的测试用例中的索引器初始化器语法:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = "2Pac"
};
Run Code Online (Sandbox Code Playgroud)

具有用于初始化JObject和向其添加属性的单独的封闭符号集使得索引初始化器比经典对象初始化器更具可读性,尤其是在复合JSON对象的情况下,如下所示:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = new JObject
    {
        ["Name"] = "2Pac",
        ["Age"] = 28
    }
};
Run Code Online (Sandbox Code Playgroud)

使用对象初始化器语法,上面的初始化将是:

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 最后一个绝对是在 c# 中编写 json 的最佳语法。 (3认同)

Dan*_* D. 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")
         )
Run Code Online (Sandbox Code Playgroud)

更多文档:http: //www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


小智 5

从属性创建 newtonsoft JObject 的简单方法。

这是用户属性示例

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}
Run Code Online (Sandbox Code Playgroud)

我希望 newtonsoft JObject 中的这个属性是:

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});
Run Code Online (Sandbox Code Playgroud)

输出将是这样的:

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}
Run Code Online (Sandbox Code Playgroud)


PAS*_*PAS 5

迟早你会拥有具有特殊性质的财产。您可以使用索引或索引和属性的组合。

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
Run Code Online (Sandbox Code Playgroud)