2016-03-29 2 views
0

У меня есть JSON:Удалить определенные свойства из объекта JSON

{ 
    "scbs_currentstatus": "", 
     "scbs_primaryissue": "", 
     "_umb_id": "Test", 
     "_umb_creator": "Admin", 
     "_umb_createdate": "0001-01-01 00:00:00", 
     "_umb_updatedate": "0001-01-01 00:00:00", 
     "_umb_doctype": "Test", 
     "_umb_login": "Test", 
     "_umb_email": "Test", 
     "_umb_password": { 
     "newPassword": "Test", 
     "oldPassword": null, 
     "reset": null, 
     "answer": null 
     }, 
     "_umb_membergroup": { 
     " User": false, 
     "Line User": true, 
     "Callback User": false, 
     "Su User": false, 
     }, 
     "umbracoMemberComments": "Test", 
     "umbracoMemberFailedPasswordAttempts": "" 

    } 

Iam пытается удалить все свойства начинаются с «umb_» .а это возможно в Json.NET?

и выход будет, как:

{ 
     "scbs_currentstatus": "", 
      "scbs_primaryissue": "", 
      "umbracoMemberComments": "Test", 
      "umbracoMemberFailedPasswordAttempts": "" 
} 

с помощью удаления я могу сделать это, однако, не все одновременно.

result.Property("_umb_id").Remove(); 

любое предложение пожалуйста?

ответ

3

Вы можете разобрать строку первой:

var temp = JArray.Parse(json); 
temp.Descendants() 
    .OfType<JProperty>() 
    .Where(attr => attr.Name.StartsWith("_umb_")) 
    .ToList() // you should call ToList because you're about to changing the result, which is not possible if it is IEnumerable 
    .ForEach(attr => attr.Remove()); // removing unwanted attributes 
json = temp.ToString(); // backing result to json 

UPDATE ИЛИ:

result.Properties() 
    .Where(attr => attr.Name.StartsWith("_umb_")) 
    .ToList() 
    .ForEach(attr => attr.Remove()); 

UPDATE # 2

Вы можете указать несколько условий в where пункте:

.Where(attr => attr.Name.StartsWith("_umb_") && some_other_condition) 

ИЛИ

.Where(attr => attr.Name.StartsWith("_umb_") || some_other_condition) 

Или все, что вам нужно.

+0

спасибо большое @Javad :) – Harshit

+0

@ Харшит приветствую вас. Вы можете также проголосовать за ответ;) –

+0

@javed. можем ли мы указать в нем более одного условия? Предположим, что поля не содержат «umbracoMember» в свойстве. – Harshit

-1

Я только что закончил десериализацию JObject и рекурсивный цикл, чтобы удалить ненужные поля. Вот функция для заинтересованных.

private void removeFields(JToken token, string[] fields) 
{ 
JContainer container = token as JContainer; 
if (container == null) return; 

List<JToken> removeList = new List<JToken>(); 
foreach (JToken el in container.Children()) 
{ 
    JProperty p = el as JProperty; 
    string propertyName = p.hasOwnProperty(key); 

    if (p != null && fields.Contains(p.propertyName) && p.propertyName.substring(0,4) == "_umb") 
    { 
     removeList.Add(el); 
    } 
    removeFields(el, fields); 
} 

foreach (JToken el in removeList) 
{ 
    el.Remove(); 
} 
}