仅替换JSON对象的某个部分

时间:2014-03-02 03:54:08

标签: c# json.net

好的。我正在为游戏作为项目编写一个保存编辑器,并且保存在JSON中。我使用它后从实际编辑器返回一个小片段,它看起来像:

{"hero":{"STR":10,"HP":33,"HT":35,"attackSkill"13,"defenseSkill":3}}

这只是保存的一小部分。我不能为我的生活弄清楚如何只在整个保存中替换这部分。我试过了

  • Json到C# - 整个事情。这不起作用,因为出于某种原因,游戏制造商决定将其中一半的字段作为他游戏中的类名,例如。 “com.whatever.whatever”:1。这吓坏了解析器。
  • 只使用返回的代码段。游戏不接受它,因为它不像实际保存那么完整。
  • 只是搜索价值观。我不能让这个工作,只是因为我不知道如何很好地操纵字符串。

我想替换

{"hero"{...}} 

部分新部分。

我该怎么做呢?感谢。

此外,游戏的pastebin保存,如果有人想要/需要它:http://pastebin.com/eK13cNtg

3 个答案:

答案 0 :(得分:8)

Json.NET支持"LINQ to JSON"和动态访问,允许动态处理整个树而无需POCO映射。这比对类型化对象进行反序列化的优势在于,对映射的添加 not 需要考虑往返序列化。

这可用于解析JSON,修改对象结构,然后重建JSON文本。

这种方法可能如下所示,或者它可以使用其他可用的查询方法之一。 (我对实际的JSON看起来并不多 - eww,顺便说一句! - 但是在适当地打印它之后,查询结构应该很容易看到。)

JObject data = JObject.Parse(json);
JObject hero = (JObject)data["hero"];
hero["STR"] = 42;        // "god-like strength" hax; modifies the JObject
json = data.ToString();  // re-serialize tree, along with modifications

dynamic type也可以用于Json.NET树的access and manipulation


Json.NET可以与“奇数名称”完美配合,但是这些名称需要使用注释指定或映射到具有动态键的类型,例如Dictionary / JObject。

然而,由于使用的名称范围很广,我在这里使用POCO路线 - 将所有内容编成完全早期绑定类型将是愚蠢的/繁琐的。但是,并不是说“英雄”无法解析为特定的POCO。

答案 1 :(得分:2)

我不是C#人,但我会看看是否有不同的解析器。内部句点是不幸的,但如果它们在引用的字符串内(如果它们不是真正的JSON则不是),解析器应该能够处理它,因为它们是有效的JSON(因为它们是有效的Javascript)。

以下Javascript

var myObj = {'no.kidding':'This is valid'};
alert(myObj['no.kidding']);

实际上会提醒您“这是有效的”。

如果您使用的解析器不支持它,我会说它不是兼容的解析器。

你可以在这里按语言找到解析器:http://json.org/ - 它看起来像C#的十几个,所以希望其中一个适合你。

一个丑陋的黑客(但可能是可用的解决方案),如果你没有任何可以搞砸的浮点数,那就是全局替换'。'解析前的'_'(或其他一些无问题的令牌),然后在重新串行化时将其反转。你也可以使用某种类型的正则表达式来只替换它们在引用字符串中的句点,这可以在数字问题上保护你一点。

答案 2 :(得分:2)

  杰森到C# - 整个事情。这对某些人来说不起作用   游戏制作者决定让一半的领域成为课堂的原因   他的比赛中的名字,例如“com.whatever.whatever”:1。这吓坏了   解析器。

我无法重现这个问题。这对我有用。

dynamic response = Newtonsoft.Json.Linq.JObject.Parse(json);
var jsonNewHero = "{'hero':{'STR':10,'HP':33,'HT':35,'attackSkill': 13,'defenseSkill':3}}";
dynamic newHero = Newtonsoft.Json.Linq.JObject.Parse(jsonNewHero);
response.hero = newHero.hero;
var newJson = Newtonsoft.Json.JsonConvert.SerializeObject(response, Newtonsoft.Json.Formatting.Indented);

使用.NET小提琴:http://dotnetfiddle.net/PKPQC1

P.S:使用最新的Newtonsoft Json版本6.0.1