【问题标题】:How to add JObject property by path if not exists?如果不存在,如何通过路径添加 JObject 属性?
【发布时间】:2018-07-14 00:05:16
【问题描述】:

给定以下代码:

var context = JObject.FromObject(new
                {
                    data = new
                    {
                        mom = "",
                        dad = "",
                        sibling = "",
                        cousin = ""
                    }
                });

var path = "$.data.calculated";

var token = context.SelectToken(path);

token 将为空。因此,当然,尝试这样做会产生异常:

token.Replace("500");

当然,我已经看到了有关如何向JObject 添加属性的其他示例,但它们似乎都需要您事先了解对象结构。我需要做的是这样的:

if (token == null)
{
    context.Add(path);
    token = context.SelectToken(r.ContextTarget);
}

然后我可以在新令牌上使用 replace 方法来设置它的值。但是 context.Add(path) 会抛出异常:

"Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject."

如何在不知道现有对象结构的情况下使用这样的完整路径动态添加属性?

【问题讨论】:

  • 没有内置的方式来做你想做的事。 JsonPath 是一种查询语法;它没有清晰地映射到新对象的创建。类似的问题:Build JObject from JSONPath

标签: c# json.net


【解决方案1】:

虽然这不是一个包罗万象的方法(例如,不能正确处理数组),但它确实可以处理上述简单情况,并且应该为层次结构提供多个级别。

if (token == null)
{
    var obj = CreateObjectForPath(path, newValue);                        
    context.Merge(obj);                        
}

还有自己动手做的部分:

private JObject CreateObjectForPath(string target, object newValue)
{
    var json = new StringBuilder();

    json.Append(@"{");

    var paths = target.Split('.');

    var i = -1;
    var objCount = 0;

    foreach (string path in paths)
    {
        i++;

        if (paths[i] == "$") continue;

        json.Append('"');
        json.Append(path);
        json.Append('"');
        json.Append(": ");

        if (i + 1 != paths.Length)
        {
            json.Append("{");
            objCount++;
        }
    }

    json.Append(newValue);

    for (int level = 1; level <= objCount; level++)
    {
        json.Append(@"}");
    }

    json.Append(@"}");
    var jsonString = json.ToString();
    var obj = JObject.Parse(jsonString);
    return obj;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多