2013-05-30 87 views
1

我有一些JSON代表应用程序的设置。一个简单的例子如下所示:如何将布尔属性添加到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); 

我缺少什么?

+0

我怎么能忘记这一点。抱歉。 现在更新它 –

+0

已更新,问题位于帖子下方 –

回答

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只是为了更具体的令牌类,如JObjectJProperty的基类。有时您必须投入JToken才能访问特定于该类的方法和属性,例如JObject上的Add方法。 (如果你有一个令牌,你不知道它是什么类型,你可以检查它的Type属性找出。)