2017-02-09 11 views
1

JSONファイルをJSONファイルから変更しようとしているため、JSONレスポンスを取得するためにこのポストにコードが見つかりました:Change values in JSON file (writing files)誰でもこれを修正しますか?エラーが発生したため、C#(NewtonSoft)でJSONを編集できません

エラー:

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は、Webサービスと対話するために行われる)

+7

'jsonObj [0] [ "フィルタ"] = "ID = 20" とを使用するクラスを作成することができ;' – Gusman

+3

JSONは配列なので、インデックスが1アイテムしかない場合でもインデックスを指定する必要があります。 – 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); 
関連する問題