2016-10-12 3 views
2

Я пытаюсь сделать json-редактор (работает с treeview) в эти дни, я изменил функцию значения, я также могу изменить некоторые клавиши, но я не могу установить ключи в объектах. я могу установить значение:Изменение ключа свойства в Json

SetValue(ref JObject main,JToken token,JToken newValue) { 
    //2nd argument is obj.SelectToken(node.Path) 
    token.Replace(newValue); 
} 

можно также установить некоторые ключи:

SetKey(ref JObject main,JToken token,string newKey) { 
    //2nd argument is obj.SelectToken(node.Path) 
    //However, if token is in object, it seys the key of object because parent is object 
    (token.Parent as JProperty).Replace(newKey); 
} 

Но как я могу установить ключи? С уважением.

ответ

2

Вам не нужно передавать исходный корневой объект по ссылке, и вам не нужен исходный корень вообще. Все, о чем вы заботитесь, это JToken и его родитель.

В этом случае, вы хотите думать о "замене", как:

  • Добавить старое значение новым ключом
  • Удалить пару старый ключ/значение
public void SetKey(JObject parent, JToken token, string newKey) 
{ 
    var tokenProp = token as JProperty; 
    var oldKeyName = tokenProp.Name; 
    parent[newKey] = tokenProp.Value; 
    parent.Remove(oldKeyName); 
} 

Мы можем предположить, что если вы заменяете ключ для пары значений ключа, объект является маркером JProperty. Кроме того, если мы заменяем ключи, также можно предположить, что родительский объект является JObject. Вы можете назвать это как таковое:

var json = "{ 'key1': 'val1' }"; 
JObject parsedObj = JsonConvert.DeserializeObject<JObject>(json); 
SetKey(parsedObj, parsedObj.First, "key2"); 
+0

Это прекрасное решение =) Но когда я пытался напечатать родительский ранее, я получил jproperty вместо объекта. Как работает родитель? –

+1

@ TalhaTalipAçıkgöz, если вы попытаетесь подобрать родителя из токена, вы можете столкнуться с неожиданными проблемами, хотя технически это тоже должно работать. Тем не менее, если вы это сделаете, вам, скорее всего, придется бросить на 'JObject'. Тем не менее, в моем подходе, если я уже иду по дереву JSON, я, вероятно, знаю как текущий корневой объект, так и токен, который мне интересен. Легче просто передать те, что были в тот момент, чем пытаться достичь для родителя из токена. –

+0

Поскольку parent - это jproperty, currentObject.SelectToken (lastNode.GetNodePath()) - это задание, которое я ищу. Таким образом, метод: void SetKey (этот объект JObject @, строка oldKey, строка newKey) {JToken oldValue = obj [oldKey]; @ Object.Remove (oldKey); @object [newKey] = oldValue} –

Смежные вопросы