将JArray添加到现有属性

时间:2017-06-28 08:46:06

标签: c# json json.net

我有这个JSON:

{
  "ID":123,
  "Products":null,
  "Title":"Products"
}

我想将一些数据从DB添加到“Products”节点,所以我的最终json将如下所示:

{
  "ID":123,
  "Products":[
      {
        "ID":1,
        "Name":"AA"
      },
      {
        "ID":2,
        "Name":"BB"
      }
    ],
  "Title":"Products"
}

我正在使用此代码:

internal class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
}

//simulate DB
var products= new List<Product>()
{
    new Product() {ID=1,Name="AA" },
    new Product() {ID=2,Name="BB" }
};

string JSONstr = FilesUtils.OpenFile(Path.Combine(Environment.CurrentDirectory, "Sample.json"));
JObject JSON = JObject.Parse(JSONstr);
        ((JValue)JSON["Products"]).Value = JObject.FromObject(products); 

但我得到一个例外:

  

对象序列化为Array。期望JObject实例。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

JSON["Products"] = JToken.FromObject(products);

要添加新属性,请执行相同的操作,例如:

JSON["TimeStamp"] = JToken.FromObject(DateTime.UtcNow);

注意:

  • JObject的{​​{3}}将使用指定的名称"Products"添加或替换该属性。

  • item setter将任何.Net对象序列化为JToken.FromObject()层次结构。 LINQ to JSON是此层次结构的抽象基类,因此可以表示数组,对象和基元。有关详细信息,请参阅JToken

示例here

答案 1 :(得分:0)

预期的对象必须是(根据您的JSON)。如果那是您想要的JSON,您可以考虑将其包装起来并添加ID和JSON中显示的标题。

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class YourObject
{
    public int ID { get; set; }
    public List<Product> Products { get; set; }
    public string Title { get; set; }
}