2017-09-14 17 views
0

:JSONの内側に、SelectTokensを使用してJSONをクエリしますか? C#でNewtonsoft.Json.Linqと私は、次のJSONに "からstatusCode" の値を変更するには、C#でNetwonsoft.JSON.Linqを利用するようにしようとしている

{ 
    "disbursements":[ 
     { 
     "id":"1f337641", 
     "contactId":"f5eb2", 
     "statusCode":166000005, 
     "amount":8, 
     "category":166000001 
     }, 
     { 
     "id":"027a4762", 
     "contactId":"f5eb2038", 
     "statusCode":166000000, 
     "amount":4000, 
     "category":166000000 
     } 
    ] 
} 

ので、データはJSON配列の「支払い」です。配列の各項目の「statusCode」を166000005に変更する必要があります。私は

JObject jsonText = JObject.Parse(bodyText); 
var statusCode = (int)jsonText.SelectToken("disbursements[0].statusCode"); 

を使用して最初の1のからstatusCodeを取得することができるよしかし、私はすべての値だけではなく、最初に変更ループやLINQを持つソリューションが必要です。

+1

1)有効なJSONサンプルを提供するために質問を編集してください。現在のJSONはhttps://jsonlint.com/で検証に失敗します。たぶん外側の中括弧 '{'と '}'だけが必要でしょうか? 2)あなたが書いた、*私は '出金[0] ["statCode"]' *によってstatusCodeを取得することができます。何を試したのか、なぜそれがうまくいかないのかを示すことができますので、必要でない答えを推測して提供する必要はありません。 See [ask]。 – dbc

+0

これは有効なJSONではありませんが、あなたのオブジェクトNewtonsoftをデシリアライズしてループバックできないのはなぜですか? –

+0

これはあなたが望むものですか? [Jsonの一部を他のものに置き換える(文字列トークンを使用)C#、Json.Net](https://stackoverflow.com/a/33056210/3744182) – dbc

答えて

0

次のコードセットや支出の配列内のすべてのエントリに"statusCode": 166000005を追加します。

var jsonText = JObject.Parse(bodyText); 
foreach (var disbursement in jsonText.SelectTokens("disbursements[*]")) 
{ 
    disbursement["statusCode"] = 166000005; 
} 

注:

  • クエリ文字列"disbursements[*]"JSONPathワイルドカード演算子[*]が含まれています。この演算子は、親要素"disbursement"の下にあるすべての配列要素に一致します。

    Json.NETは、Querying JSON with JSONPathに記載されているJSONPath構文をサポートしています。

  • SelectTokens()SelectToken()ではなく、複数の可能性のある一致をループします。

  • JTokenitem setterdisbursement["statusCode"] = 166000005は、存在する場合は"statusCode"プロパティを置き換え、存在しない場合は追加します。

  • 166000005などの単純なアトミック値は、直接JToken階層に設定できます。複雑なPOCOのためには、例えば、階層構造でそれを設定する前にJTokenにそれをシリアル化するためにJToken.FromObject()をコールする必要があります。:

    disbursement["statusCode"] = 
        JToken.FromObject(new { oldValue = disbursement["statusCode"], newValue = 166000005 }); 
    

.Net fiddleワーキングサンプル。

0

データを表すクラスを作成します。

は、データ保持するクラスを作成します:ここに私のソリューションです

public class Disbursement 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 

    [JsonProperty("contactId")] 
    public string ContactId { get; set; } 

    [JsonProperty("statusCode")] 
    public int StatusCode { get; set; } 

    [JsonProperty("amount")] 
    public int Amount { get; set; } 

    [JsonProperty("category")] 
    public int Category { get; set; } 
} 

コレクション:

public class Disbursements 
{ 
    [JsonProperty("disbursements")] 
    public List<Disbursement> Items { get; set; } = new List<Disbursement>(); 
} 

そしてロード/変更/保存データ:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var disbursements = 
      JsonConvert.DeserializeObject<Disbursements>(
       File.ReadAllText(
        "data.json", 
        Encoding.UTF8 
       ) 
      ); 

     foreach (var disbursement in disbursements.Items) 
     { 
      disbursement.StatusCode = 166000005; 
     } 

     string modifiedContent = JsonConvert.SerializeObject(disbursements); 

     File.WriteAllText(
      "modifiedData.json", 
      modifiedContent, 
      Encoding.UTF8 
     ); 
    } 
} 
関連する問題