我正在尝试在C#中使用Netwonsoft.JSON.Linq来更改以下JSON中的“statusCode”值:
{
"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");
但是我需要一个带有循环或LINQ的解决方案来改变所有的值,而不仅仅是第一个。
答案 0 :(得分: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()
来循环遍历多个可能的匹配。
JToken
item setter disbursement["statusCode"] = 166000005
将替换"statusCode"
属性(如果存在),如果不存在则添加。
可以将166000005
等简单的原子值直接设置为JToken
层次结构。对于复杂的POCO,您需要在层次结构中设置它之前调用JToken.FromObject()
将其序列化为JToken
,例如:
disbursement["statusCode"] =
JToken.FromObject( new { oldValue = disbursement["statusCode"], newValue = 166000005 } );
示例工作.Net fiddle。
答案 1 :(得分: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
);
}
}