JSON更改值

时间:2018-05-30 16:14:51

标签: c# json

我有像这样的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"}

这样的modifiedJsonString

有谁能告诉我如何解决这个问题

3 个答案:

答案 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);

See it in action

答案 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; }
}

Here's a working example

在您的情况下,该类看起来像:

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

(请注意财产案件)。