C# 反序列化JSON,然后将其部分序列化回来
我到处都找不到我要找的东西。也许我不知道如何正确地描述它 假设我给出了JSON结构:C# 反序列化JSON,然后将其部分序列化回来,c#,json,json.net,C#,Json,Json.net,我到处都找不到我要找的东西。也许我不知道如何正确地描述它 假设我给出了JSON结构: { "important": { "key1": "aaaa", "key2": "bbbb", "key3": "cccc" }, "_meta": { "other": { "default": "a", "something": 1 }}} 我只对重要的部分感兴趣 要获取重要的数据,请执行以下操作: string temp = File.Re
{
"important": {
"key1": "aaaa",
"key2": "bbbb",
"key3": "cccc"
},
"_meta": {
"other": {
"default": "a",
"something": 1
}}}
我只对重要的部分感兴趣
要获取重要的数据,请执行以下操作:
string temp = File.ReadAllText(jsonPath);
data = (JObject)JsonConvert.DeserializeObject(temp);
var important = data["important"].Value<JObject>().ToString();
importantData = JsonConvert.DeserializeObject<Dictionary<string, string>>(important);
因此,我得到:
{"important":"{\"key1\":\"aaaa\",\"key2\":\"bbbb\",\"key3\":\"cccc\"}","_meta":{"other":{"default":"a","something":1}}}
这几乎很好,因为它有所有的修改,但也有额外的\
在重要部分中的每个“
之前。另一件事是,所有内容都在一行中,我希望它像以前一样以排序和干净的格式出现
我认为问题在于双重序列化,但我不知道如何避免它。尝试以下方法:
JsonConvert.serialized对象(数据、格式、缩进)
根据Newtonsoft文档,添加格式。缩进将导致输出json字符串被展开/缩进,而不是转义
替换以下行:
string json = JsonConvert.SerializeObject(importantData);
data["important"] = json;
在下一行:
data["important"] = JToken.FromObject(importantData);
编辑:@Maxim_A在我打字时回答了这个问题。这个答案基本上就是这里所说的
问题似乎是当您序列化重要数据
,然后使用字符串表示数据[“重要”]
的json时。相反,您实际上可以将重要数据
表示为作业对象,然后使用它
以下是我使用的代码:
using System;
using System.IO;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace jsonDeserializeThenSerializeBackQuestion
{
class Program
{
static void Main(string[] args)
{
var temp = File.ReadAllText("test.json");
var data = (JObject)JsonConvert.DeserializeObject(temp);
var important = data["important"].Value<JObject>().ToString();
var importantData = JsonConvert.DeserializeObject<Dictionary<string, string>>(important);
importantData["key1"] = "modified";
var json = JObject.FromObject(importantData);
Console.WriteLine(json);
data["important"] = json;
var rdyJson = JsonConvert.SerializeObject(data);
Console.WriteLine(rdyJson);
}
}
}
由于数据表示为JObject而不是字符串,因此当您再次序列化它时,它不会跳出双引号。在您的实现中,它将json键important
设置为字符串,而不是实际的json对象。我认为发生这种情况是因为您将json序列化了两次。只有@Maxim\u a回答了这个问题a(比你早一点)@Maxim_A,这就是为什么我在底部添加了编辑。@Maxim_A移到了我文章的顶部以提高可视性:)虽然这段代码可以回答这个问题,但最好在不介绍其他人的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,只有代码的答案是没有用的。@stop cran I th也许这很明显,因为这只是方法的一个重载。但是你说得对,我将添加更多的解释。这是本质,请转到@Aaron Raff的答案以了解更多细节。对于格式表单部分@Siavash是正确的:JsonConvert.SerializeObject(数据,格式。缩进)
using System;
using System.IO;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace jsonDeserializeThenSerializeBackQuestion
{
class Program
{
static void Main(string[] args)
{
var temp = File.ReadAllText("test.json");
var data = (JObject)JsonConvert.DeserializeObject(temp);
var important = data["important"].Value<JObject>().ToString();
var importantData = JsonConvert.DeserializeObject<Dictionary<string, string>>(important);
importantData["key1"] = "modified";
var json = JObject.FromObject(importantData);
Console.WriteLine(json);
data["important"] = json;
var rdyJson = JsonConvert.SerializeObject(data);
Console.WriteLine(rdyJson);
}
}
}
{
"key1": "modified",
"key2": "bbbb",
"key3": "cccc"
}
{"important":{"key1":"modified","key2":"bbbb","key3":"cccc"},"_meta":{"other":{"default":"a","something":1}}}