我有像这样的JSON值
{"$id":"649271776","$type":"outdoorgame","Overs":50,"Balls":6,"TeamName":"TestTeam"}
我写了一个这样的C#代码,将Overs的值从50改为10
var jsonString = sSession.GameState; //this is the value {"$id":"649271776","$type":"outdoorgame","Overs":50,"Balls":6,"TeamName":"TestTeam"}
dynamic jsonObject =
Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
jsonObject.Overs = 10;
var modifiedJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject);
此代码将Overs的值从50更改为10.当我使用上面的代码modifiedJsonString时,我遇到的问题是缺少这两个值
"$id":"649271776","$type":"outdoorgame"
将输出设为{Overs":10,"Balls":6,"TeamName":"TestTeam"}
我希望{jenString}中有$id
和$type
。
我想要像这个{"$id":"649271776","$type":"outdoorgame","Overs":10,"Balls":6,"TeamName":"TestTeam"}
有谁能告诉我如何解决这个问题
答案 0 :(得分:2)
问题是$id
和$type
不是有效的标识符,并且不能作为JSON序列化程序构建的返回动态对象的成员出现。正如在gldraphael的回答中,解决方案是创建自己的具体类来保存反序列化的对象;对于名称以$
开头的属性,您需要使用JsonPropertyAttribute
重新映射名称:
public class GameState
{
[JsonProperty("$id")] public string ID { get; set; }
[JsonProperty("$type")] public string Type { get; set; }
int Overs { get; set; }
int Balls { get; set; }
public string TeamName { get; set; }
}
此外,Json.NET treats $type
as a special property name会干扰对象的正确反序列化。要解决此问题,我们必须使用MetadataPropertyHandling.Ignore
序列化程序设置。
因此,您可以像这样反序列化,修改和重新序列化:
string jsonString = "{\"$id\":\"649271776\",\"$type\":\"outdoorgame\",\"Overs\":50,\"Balls\":6,\"TeamName\":\"TestTeam\"}";
JsonSerializerSettings settings = new JsonSerializerSettings() { MetadataPropertyHandling = MetadataPropertyHandling.Ignore };
GameState jsonObject = JsonConvert.DeserializeObject<GameState>(jsonString, settings);
jsonObject.Overs = 10;
var modifiedJsonString = JsonConvert.SerializeObject(jsonObject);
答案 1 :(得分:1)
您可以使用JToken
来处理此问题。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var jsonString = "{\"$id\":\"649271776\",\"$type\":\"outdoorgame\",\"Overs\":50,\"Balls\":6,\"TeamName\":\"TestTeam\"}";
JToken jsonObject = JToken.Parse(jsonString);
jsonObject["Overs"] = 10;
var modifiedJsonString = JsonConvert.SerializeObject(jsonObject);
// In case one wanted to update the $type and $id fields
jsonObject["$type"] = "asdf";
jsonObject["$id"] = 123456;
var modifiedJsonString2 = JsonConvert.SerializeObject(jsonObject);
会导致:
modifiedJsonString - &gt; {"$id":"649271776","$type":"outdoorgame","Overs":10,"Balls":6,"TeamName":"TestTeam"}
如果您需要更新$id
和$type
,那也是可能的。
modifiedJsonString2 - &gt;
{"$id":123456,"$type":"asdf","Overs":10,"Balls":6,"TeamName":"TestTeam"}
.NET小提琴上的演示:https://dotnetfiddle.net/a370Mv
答案 2 :(得分:0)
使用具体课程。您需要手动使用$前缀注释字段。例如:
public class Example
{
public string Field { get; set; }
[JsonProperty("$type")]
public string Type { get; set; }
}
在您的情况下,该类看起来像:
public class ObjName
{
[JsonProperty("$id")]
public string Id { get; set; }
[JsonProperty("$type")]
public string Type { get; set; }
public int Overs { get; set; }
public int Balls { get; set; }
public string TeamName { get; set; }
}
(请注意财产案件)。