2017-09-14 117 views
0

我試圖利用Netwonsoft.JSON.Linq在C#中,更改以下JSON的 「的StatusCode」 值:使用SelectTokens查詢JSON?隨着Newtonsoft.Json.Linq在C#

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

因此,JSON內數據是:「支出」,這是JSON數組。我必須將數組中每個項目的「statusCode」更改爲166000005。我能夠檢索使用

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

的第一個的StatusCode但我需要帶環或LINQ改變所有的值,而不只是第一個解決方案。

+1

1)您可以請[編輯]您的問題以提供有效的JSON樣本?您當前的JSON無法通過https://jsonlint.com/進行驗證。也許你只需要外括號'{'和'}'? 2)你寫了*,我可以通過'disbursement [0] [「statCode」]'*來檢索statusCode。你能否展示你的嘗試以及爲什麼它不起作用,所以我們不必猜測並提供你不需要的答案?見[問]。 – 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支持JSONPath語法,如Querying JSON with JSONPath所述。使用

  • 使用SelectTokens()而不是SelectToken()來遍歷多個可能的匹配。

  • JTokenitem setterdisbursement["statusCode"] = 166000005將取代"statusCode"屬性(如果存在)並添加它,如果不存在。

  • 可以將一個簡單的原子值(如166000005)直接設置爲JToken層次結構。對於複雜的POCO則需要在層次結構中設置它之前調用JToken.FromObject()將其序列爲JToken,例如:

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

樣品工作.Net fiddle

0

我會創建類來表示數據。這裏是我的解決方案:

創建數據holder類:

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 
     ); 
    } 
}