【问题标题】:Creating JSON on the fly with JObject使用 JObject 即时创建 JSON
【发布时间】:2013-08-17 06:57:39
【问题描述】:

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

【问题讨论】:

  • 艺术家/专辑选择应该获得双倍积分!

标签: c# json json.net


【解决方案1】:

那么,怎么样:

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

【讨论】:

  • 完美!正是我要找的东西,完全忘记了dynamic
  • 我在尝试运行您的代码时收到“Newtonsoft.Json.Linq.JObject”不包含“日期”错误的定义。我可以使它工作的方法是将第一行更改为:dynamic jsonExpando = new ExpandoObject(); 并在您的代码后添加一行:JObject jsonObject = JObject.FromObject(jsonExpando);
  • 如果你想添加一个 List 到你的 Json 对象,你需要做类似jsonObject.list = JToken.FromObject(mylist);的操作。
  • 您可以使用索引和属性表示法的组合,以防您遇到具有特殊字符的字段名称,例如Create-Year"。您将无法编写 jsonObject.Create-Year = 1995,但可以使用以下内容。jsonObject["Create-Year"] = 1995; jsonObject.Artist = "2Pac";
  • 现在你有魔法属性,而不是魔法字符串 :)
【解决方案2】:

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

【讨论】:

  • JObject.FromObject 应该被标记为正确答案。谢谢。
  • 我认为如果有像- 这样的特殊字符的属性,JObject.FromObject 将不起作用。
  • 这是一个更好的答案!
【解决方案3】:

当您的 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 }
        }
    }
};

【讨论】:

【解决方案4】:

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这如何回答这个问题?
    • @Enigmativity,我想说的是,您可以同时使用索引表示法和属性表示法。即 obj[x] =x1; obj.y = y1 可以在相同的代码中使用。动态关键字和索引符号的组合回答了这些问题。没有其他答案提到这一点。可能,这应该是评论而不是答案。
    • 我只是认为问题是关于不使用魔术字符串,但这个答案给了他。
    • @Enigmativity,动态关键字只会愚弄编译器。所以它与任意字符串没有什么不同。动态类型的对象不是强类型的。它只是一个语法糖。如果底层对象没有属性,它将在运行时失败。但是如果属性名称包含特殊字符,例如,您就不能使用属性。 99BottlesOfBeer,命名空间,It's-All-Over。所以在这些情况下,我们可以使用索引属性。其他答案让您认为它是一个或另一个,但您可以混合和匹配属性和索引。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 你实际上并没有在这里使用库 newtonsoft
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2010-11-26
      相关资源
      最近更新 更多