【问题标题】:Newton-soft - How to add values to nested attributes which not even existsNewton-soft - 如何向甚至不存在的嵌套属性添加值
【发布时间】:2020-07-29 17:10:05
【问题描述】:

我有下面的 Json 结构

{
  "Name": "abc",
  "Grade": "a"
}

现在,我想向位于层次结构中的属性添加值。例如,我想像下面一样添加价值-

Name.Lavel-1.Lavel-2.Lavel-3.Direaction = "East"

如上所述,我必须添加“Direction”属性的值,该属性本身位于不存在的 Lavel-3 属性内。同样,Lavel-1Lavel-2 在添加时甚至都不存在。

所以,我的要求是添加所需的层次结构,然后添加值。因此,添加后,json 应如下所示

{
  "Name": "Jack",
  "Grade": "A",
  "Lavel-1": {
    "Lavel-2": {
      "Lavel-3": {
        "Direction": "East"
      }
    }
  }
}

我 google 并尝试了一些解决方案,但大多数都是简单地将值添加/更新到现有路径,即层次结构已经可用的位置,并且仅对 Leaf 节点进行修改。

需要帮助,如果我们能有效地做到这一点。

【问题讨论】:

标签: c# json.net


【解决方案1】:

一种方法是添加新的 JObjects 和 JProperties:

var jstring= @"{
  ""Name"": ""abc"",
  ""Grade"": ""a""
}";

var json = JObject.Parse(jstring);
json.Add(
    new JProperty("Lavel-1",
        new JObject(new JProperty("Lavel-2",
            new JObject(new JProperty("Lavel-3",
                new JObject(new JProperty("Direction","East"))
            ))
        ))
    )
);

【讨论】:

  • 感谢您的回复。层次结构不是静态的。它的动态..另外,层次节点的存在是事先不知道的,即“Lavel-1”和“Lavel-2”可能已经存在,所以如果是这样的话,那么只有两个节点“Lavel-3”和“Direction” " 需要创建和添加。所以,这里的要求是,层次结构中的节点不固定..
  • @Lalit - 那么您应该edit 您的问题并提供minimal reproducible example 说明您的所有要求。您当前的问题指出我的要求是添加所需的层次结构,然后添加值。 而不是添加或更新。顺便说一句,这个答案中的属性名称"Lavel-1" 没有任何硬连线,它们可以很容易地提取到字符串变量中,所以这看起来可以回答您当前编写的问题。
【解决方案2】:

感谢磁控管的回复。 更新答案可以帮助我满足我的需求,因为它也可以帮助其他开发人员。

我在另一个满足我需要的 stackoverflow 线程上找到了以下步骤。我改变一点。下面的代码块将添加路径(如果不存在)并设置值。

 private void AddPropertyToJTokenWithValue(JToken jtoken, string tokenPath, string value)
        {
            if (jtoken == null || tokenPath == null)
            {
                return;
            }

            var pathParts = tokenPath.Split('.');
            foreach (var pathPart in pathParts)
            {
                var partNode = jtoken.SelectToken(pathPart);
                if (partNode == null)
                {
                    try
                    {
                        if (pathPart != pathParts.Last())
                        {
                            ((JObject)jtoken).Add(pathPart, new JObject());
                            partNode = jtoken.SelectToken(pathPart);
                        }
                        else
                        {
                            ((JObject)jtoken).Add(pathPart, value);
                            partNode = jtoken.SelectToken(pathPart);
                        }
                    }
                    catch (Exception ex)
                    {
                        // log
                         return;
                    }
                }

                jtoken = partNode;
            }

            return;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2011-03-21
    • 2014-11-20
    • 2013-11-07
    • 2018-12-22
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多