当前位置: 首页 > 知识库问答 >
问题:

如何更新JSON字符串中的属性值?

印曜灿
2023-03-14

下面是我的JSON:

[
  {
    "name": "Node-1",
    "flag": true,
    "myObj": {
      region: {
        info: {
          name: null,
          infoFlag: false,

        }
      }
    },
    "nodes": [
      {
        "name": "Node-1-1",
        "flag": true,
        "myObj": {
          region: {
            info: {
              name: "abc",
              infoFlag: false,

            }
          }
        },
        "nodes": [
          {
            "name": "Node-1-1-1",
            "flag": true,
            "myObj": {
              region: {
                info: {
                  name: "xyz",
                  infoFlag: false,

                }
              }
            },
            "nodes": [

            ]
          }
        ]
      }
    ]
  }
]

我想用下面的规则更新上述JSON字符串的两个属性:

标志:我想盲目地将此属性更新为false

infoFlag:如果< code>info的< code>name属性为< code>null,那么我希望将< code>infoFlag更新为< code>true否则为< code>false,如果它为< code>not null。

因此,在用这些规则更新JSON之后,我希望将JSON作为字符串。

注意:我不想反序列化,然后根据以上两条规则更新属性,因为我的JSON有很多属性,我不想为它们创建类,所以我在寻找一些不需要反序列化就能工作的东西。

这是我尝试去做的:

string json = "MyJson";
var temp =  JArray.Parse(json);
temp.Descendants()
    .OfType<JProperty>()
json = temp.ToString();

但是在这里,我没有得到如何递归遍历我的 JSON;如您所见,我有如下所示的递归结构:

Node-1
    Node-1-1
       Node-1-1-1

共有2个答案

司徒博容
2023-03-14

如果我了解您的需求,那么这段代码非常冗长且不那么优雅,但可以工作:

    JArray temp =  JArray.Parse(json);

    foreach (JToken tk in temp.Descendants())
    {
        if (tk.Type == JTokenType.Property)
        {
            JProperty p = tk as JProperty;

            if (p.Name == "flag")
            {
                if ((bool)p.Value.ToObject(typeof(bool)) == true)
                    p.Value = false;
            }

            if ((p.Name == "info") && p.HasValues)
            {
                bool flag = false;

                foreach (JToken tkk in p.Descendants())
                {
                    if (tkk.Type == JTokenType.Property)
                    {
                        JProperty pp = tkk as JProperty;

                        if ((pp.Name == "name") && (pp.Value.Type == JTokenType.Null))
                        {
                            flag = true;
                        }

                        if ((pp.Name == "infoFlag"))
                        {
                            pp.Value = (flag == true) ? true : false;
                        }
                    }
                }
            }
        }
    }

    json = temp.ToString();

这是结果输出:

[
  {
    "name": "Node-1",
    "flag": false,
    "myObj": {
      "region": {
        "info": {
          "name": null,
          "infoFlag": true
        }
      }
    },
    "nodes": [
      {
        "name": "Node-1-1",
        "flag": false,
        "myObj": {
          "region": {
            "info": {
              "name": "abc",
              "infoFlag": false
            }
          }
        },
        "nodes": [
          {
            "name": "Node-1-1-1",
            "flag": false,
            "myObj": {
              "region": {
                "info": {
                  "name": "xyz",
                  "infoFlag": false
                }
              }
            },
            "nodes": []
          }
        ]
      }
    ]
  }
]
公西俊德
2023-03-14

Json.NET 允许您将其表示 JSON 内容的内部对象视为动态对象,这使得相关任务并不比使用常规类型化对象更难。

唯一棘手的问题是递归对象结构(节点数组),但这不是 JSON 或动态特定问题,可以通过多种方式解决 - 明显的递归方法或我更喜欢的树扁平化枚举(扩展方法来自我的答案如何通过 LINQ 平展树?

也就是说,解决方案可能是这样的:

var array = JArray.Parse(json);
var nodes = array.Cast<dynamic>().Expand(x => x.nodes);
foreach (var node in nodes)
{
    node.flag = true;
    var info = node.myObj.region.info;
    info.infoFlag = (info.name == null);
}
var newJson = array.ToString();
 类似资料:
  • 我正在创建一个SpringBoot/Angular 8应用程序,并在尝试更新解耦的前端/后端对象时遇到一些问题。当我发送包含角模型的json post请求时,'d或其他缺失的值将被更新为null,而不是被忽略。 这个堆栈溢出问题与此密切相关,推荐的解决方案确实有效,但它打断/绕过了一系列Jackson/Hibernate注释(例如和),所以,如果可能的话,我想寻找其他的解决方案:当使用json解析

  • 问题内容: 如何使用JSON.NET从JSON中获取“ myThings”数组,如下所示? 范例1: 范例2: 我遇到的一些困难: 属性名称之一是不可预测的数字(“ 1234”和“ 7890”) 有时“ myThings”数组不存在-在这种情况下,我想要的是null或空数组/集合 可以帮助您的另一个考虑因素:我确实有一个静态类来表示myThings数组中的内容,所以我的理想返回值是 我的第一个尝试

  • 问题内容: 我有一个像这样的JSON字符串: 我想将属性更新为,如果值为,并且值为。 我已经到了这一点,但是不确定如何进行: 我不知道怎么去的是一个孩子。 提前致谢。任何指针都很棒。 问题答案: 您可以使用属性作为键来访问对象: 对于您的示例,请尝试:

  • 问题内容: 我将json字符串存储到mysql中的文本字段中。插入后,我想更新我的json字符串,并使用jackson json将mysql行ID添加到其中。 我有一个Json格式的Java字符串 我希望添加另一个K / V,而无需编写代码行。 终于有了这个: 我可以将String转换为JsonNode: 想要做这样的事情 然后在mysql中使用新的json字符串在我的文本字段中更新 我做不到 我

  • 我将json字符串存储到MySQL中的文本字段中。插入之后,我希望更新我的json字符串,并使用jackson json将mysql行id添加到其中。 我有一个Json格式的java字符串