2

我有一些 JSON 代表应用程序的设置。一个简化的例子如下所示:

{
  "data": {
    "app_settings": {
      "jbofmngeodhmdlnicmlnfhjmmbdbcokh": {
        "title": "app 1",
        "description": "desc 1",
        "custom_app_setting_stored_below": "asd",
        "cust1": 3,
        "cust2": false
      },
      "esghmzlnxcfpnrkbokmvgtjmcaknysdb": {
        "title": "app 2",
        "description": "desc 2",
        "custom_app_setting_stored_below": "asd",
        "cust8": 12,
        "cust10": "11/25/2013",
        "cust11": "nothing",
        "cust12": true,
        "cust13": 3
      }
    }
  }
}

应用程序可以有扩展名(在设置中由随机的长字母串表示),每个扩展名下都可以有自己的自定义设置。

我可以通过为扩展添加“黑名单”属性并将其设置为 true 来手动将扩展列入黑名单。这将阻止应用程序加载扩展。

以下是列入黑名单的扩展程序示例:

  "jbofmngeodhmdlnicmlnfhjmmbdbcokh": {
    "title": "app 1",
    "description": "desc 1",
    "custom_app_setting_stored_below": "asd",
    "cust1": 3,
    "cust2": false,
    "icons": {
      "128": "text21456.gif",
      "16": "text21456.gif",
      "48": "text21456.gif"
    },
    "plugins": [
      {
        "path": "plugins/ApiPlugin.dll",
        "public": true
      },
      {
        "path": "plugins/mp.dll",
        "public": true
      },
      {
        "path": "plugins/Plugin.dll",
        "public": true
      }
    ],
    "blacklist": true
  }

现在我希望能够以编程方式将扩展程序列入黑名单。
在 C# 中,我正在搜索这样的特定扩展:

var data = json["data"];
var app_settings = data["app_settings"];
var a = app_settings.Children().ToList();
foreach (var b in a)
{
    if (b.ToString().ToLower().Contains("extensionname"))
    {
        JToken ext = b;

        // need to add blacklist property here
    }
}

因此,例如,如果搜索匹配,我可能会有这样的内容ext

"jbofmngeodhmdlnicmlnfhjmmbdbcokh": {
    "custom_extension_property_1": "value 1",
    "custom_extension_property_2": "value 2"
}

如何在这些扩展设置中添加“黑名单”布尔属性,使其看起来像这样?

"jbofmngeodhmdlnicmlnfhjmmbdbcokh": {
    "custom_extension_property_1": "value 1",
    "custom_extension_property_2": "value 2",
    "blacklist": true
}

我认为这行不通:

bool blacklist = true;
ext.AddAfterSelf(blacklist);

或这个:

someobject o = new someobject() {
   blacklist = true;
};
ext.AddAfterSelf(o);

我错过了什么?

4

1 回答 1

0

从您的问题来看,您似乎正在尝试通过其标题查找特定扩展名,然后在找到该标题时将“黑名单”属性添加到该扩展名的设置中。你可以这样做:

string extensionNameToBlacklist = "app 1";

var data = json["data"];
var app_settings = data["app_settings"];

foreach (JProperty extensionProperty in app_settings)
{
    JObject extensionObject = (JObject)extensionProperty.Value;
    if ((string)extensionObject["title"] == extensionNameToBlacklist)
    {
        extensionObject.Add("blacklist", true);
    } 
}

小提琴:https ://dotnetfiddle.net/tESgmB

我认为您缺少的部分JToken只是更具体的令牌类的基类,例如JObjectand JProperty。有时您必须强制JToken转换才能访问特定于该类的方法和属性,Add例如JObject. (如果你有一个令牌,但你不知道它是什么类型的,你可以检查它的Type属性来找出。)

于 2016-12-07T23:44:23.257 回答