2017-02-09 8 views
1

Я пытаюсь изменить JSON из файла JSON, чтобы я мог запустить его, чтобы получить ответ JSON, я нашел код на этом посту: Change values in JSON file (writing files) может кто угодно почини это?Невозможно отредактировать JSON с C# (NewtonSoft), потому что я получаю сообщение об ошибке

Ошибка:

An unhandled exception of type 'System.ArgumentException' occurred in Newtonsoft.Json.dll

Additional information: Set JArray values with invalid key value: "filter". Int32 array index expected.

JSON:

[{ 
    "tablename" : "table", 
    "columns" : "id, name", 
    "filter" : "id = 10" 
}] 

Код:

string json = File.ReadAllText("file.json"); 
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); 
jsonObj["filter"] = "id = 20"; 
string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented); 
File.WriteAllText("file.json", output); 

(JSON сделан, чтобы поговорить с WebService)

+7

'jsonObj [0] [ "фильтр"] = "ID = 20";' – Gusman

+3

Ваш JSON - это массив, поэтому вы должны указать индекс, даже если он всего один элемент длинный. – Equalsk

ответ

2

Я считаю, что это должно be:

jsonObj[0]["filter"] = "id = 20"; 

Как ваш JSON - это массив. Итак, 0 - первый объект в массиве.

1

У вас есть несколько вариантов, но, видя, как вы десериализуете его в динамике, вы можете попробовать следующее.

var json = File.ReadAllText("file.json"); 
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); 

jsonObj[0].filter = "id = 20"; //<--CALLING PROPERTY DIRECTLY via DynamicObject 

var output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented); 
File.WriteAllText("file.json", output); 

Представленные данные JSON представляют собой массив JSON, поэтому вам нужно использовать индекс для получения элементов массива.

Вы также можете создать класс для хранения десериализованных данных

public class Model 
{ 
    public string tablename { get; set; } 
    public string columns { get; set; } 
    public string filter { get; set; } 
} 

и использовать это

var json = File.ReadAllText("file.json"); 
//Deserializing Object to Model Array 
var jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Model[]>(json); 

jsonObj[0].filter = "id = 20"; //<--CALLING PROPERTY DIRECTLY 

var output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented); 
File.WriteAllText("file.json", output); 

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

  • Нет связанных вопросов^_^