C# 仅替换JSON对象的特定部分

C# 仅替换JSON对象的特定部分,c#,json.net,C#,Json.net,好的。我正在为一个游戏开发一个保存编辑器作为一个项目,保存是JSON格式的。我在使用实际编辑器后返回了一个小片段,它看起来像: {"hero":{"STR":10,"HP":33,"HT":35,"attackSkill"13,"defenseSkill":3}} 这只是节省的一小部分。我一辈子都不知道如何在整个保存过程中只替换这一部分。我试过了 从Json到C#-ing,整个过程。这不起作用,因为出于某种原因,游戏制作人决定让一半的字段是他游戏中的类名,例如“com.whater.what

好的。我正在为一个游戏开发一个保存编辑器作为一个项目,保存是JSON格式的。我在使用实际编辑器后返回了一个小片段,它看起来像:

{"hero":{"STR":10,"HP":33,"HT":35,"attackSkill"13,"defenseSkill":3}}
这只是节省的一小部分。我一辈子都不知道如何在整个保存过程中只替换这一部分。我试过了

  • 从Json到C#-ing,整个过程。这不起作用,因为出于某种原因,游戏制作人决定让一半的字段是他游戏中的类名,例如“com.whater.whater”:1。这会使解析器崩溃
  • 仅使用返回的代码段。游戏不会接受它,因为它没有实际的扑救那么完整
  • 只是在搜索值。我不能让它工作,只是因为我不知道如何很好地操纵字符串
我只想换个新的

{"hero"{...}} 
用新零件分开

我该怎么做呢?谢谢

另外,如果有人想要/需要,请使用游戏save的pastebin:

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

下面的Javascript

var myObj = {'no.kidding':'This is valid'};
alert(myObj['no.kidding']);
事实上会提醒你“这是有效的”

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

您可以在这里找到语言解析器:-对于C#来说,它看起来有十几个,所以希望其中一个能为您工作

如果你没有任何浮点数,一个难看的破解(但可能是可行的解决方案),那就是在解析之前对“u”(或其他一些没有问题的标记)进行“.”的全局替换,然后在重新字符串化时将其反转。如果句点位于带引号的字符串中,您还可以使用某种类型的正则表达式来替换句点,这样可以在数字问题上保护您一点

从Json到C#-ing,整个过程。这不起作用,因为对某些人来说 游戏制作人决定将一半场地归为职业场地的原因 游戏中的名字,例如“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小提琴:

注:使用最新的Newtonsoft Json版本6.0.1,支持动态访问,允许动态处理整个树,无需POCO映射。与反序列化为类型化对象相比,这种方法的优势在于,映射的添加不需要考虑往返序列化

这可以用来解析JSON,修改对象结构,然后重新生成JSON文本

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

也可以用于Json.NET树的索引


Json.NET可以很好地处理“奇数名称”,但这些名称需要用注释指定,或者映射到具有动态键的类型,例如Dictionary/JObject


然而,由于所使用的名称范围很广,我不会在这里使用POCO路由——将所有内容编成完全早期绑定的类型将是愚蠢的困难/乏味;然而,这并不是说“英雄”不能被解析为特定的POCO。

是的,.NET的Json库允许“动态”对象访问,就像JavaScript一样。在这种情况下,使用其中一种(包括Json.NET)确实是一种可行的方法。
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