更新对象数组

时间:2017-06-15 17:06:04

标签: c# json json.net

我有一个json文件,格式如下:

{
  "value": [
    {
      "ccCode": "1234",
      "attributes": {
        "ePCode": 23467
      }
    },
    {
      "ccCode": "1234",
      "attributes": {
        "ePCode": 23467
      }
    }
  ]
}

我简化了json,但它在attributes属性中有更多字段和更多嵌套属性。我正在尝试迭代值数组中的对象,并检索其两个属性。根据这两个值,我将获取第3个值,并希望将其作为附加prop添加到attributes属性中。所以最后我想要:

{
  "value": [
    {
      "ccCode": "1234",
      "attributes": {
        "ePCode": 23467,
        "newFlag": true
      }


  },
    {
      "ccCode": "1234",
      "attributes": {
        "ePCode": 23467,
         "newFlag": false
      }
    }
  ]
}

我在下面创建了代码。到目前为止,我可以获取我感兴趣的属性。我的问题是尝试更新它。任何帮助将不胜感激。

string templateFile = @"C:\Users\template.json";
//rss
JObject template = JObject.Parse(File.ReadAllText(templateFile));

foreach (var record in template)
{
    string name = record.Key;
    JToken value = record.Value;
    foreach(var obj in value)
    {
        //fetch two values from each json object, 
        //based on these , fetch a flag and then add it to the json object
        var ep = obj["attributes"];
        ep = ep["ePCode"].Value<int?>();
        var cost = obj["ccCode"].ToString();
        bool isCostValuable = isCostValuable((int)ep, cost);

        ///want to add a new property in the property attributes
        //this is where I get stuck
        foreach(JProperty prop in obj)
        {
            if (prop.Name == "attributes")
            {
                JObject first = (JObject)obj;
                JArray item = (JArray)first["attributes"];
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你离得很近,你只需要通过调用ep.Add(来替换最里面的foreach循环,然后通过调用template.ToString()来保存你的数据;

string templateFile = @"C:\Users\template.json";
string outputFile = @"C:\Users\output.json";
//rss
JObject template = JObject.Parse(File.ReadAllText(templateFile));

foreach (var record in template)
{
    string name = record.Key;
    JToken value = record.Value;
    foreach(var obj in value)
    {
        //fetch two values from each json object, 
        //based on these , fetch a flag and then add it to the json object
        var ep = obj["attributes"];
        ep = ep["ePCode"].Value<int?>();
        var cost = obj["ccCode"].ToString();
        bool isCostValuable = isCostValuable((int)ep, cost);

        ep.Add("newFlag", isCostValuable);
    }
}

File.WriteAllText(outputFile, templateFile.ToString());

答案 1 :(得分:0)

如果你有更多字段,你的代码就会变脏!!

您可以遵循以下结构:

首先,在C#中创建一些与JSON模型相同的类,如:

public class Attribute
{
    public string ePCode { get; set; }
}
public class Container
{
    public string ccCode { get; set; }
    public List<Attribute> attributes { get; set; }
}
public class ValueContainer
{
    public List<Container> value { get; set; }
}

然后只需使用Json.NET框架将这些转换为:

  

Json.NET是一种流行的.NET高性能JSON框架。   它是开源软件,完全免费

ValueContainerdata = JsonConvert.DeserializeObject<ValueContainer>(templateFile);

foreach (var item in x.value)
{
    item.ccCode = "new ccCode";
    foreach (var attr in item.attributes)
    {
        attr.ePCode = "new ePCode";
    }
}

之后您已经更新了数据,您只需将其更改回JSON:

var updatedJSON = JsonConvert.SerializeObject(data);