Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化JSON,然后将其部分序列化回来_C#_Json_Json.net - Fatal编程技术网

C# 反序列化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

我到处都找不到我要找的东西。也许我不知道如何正确地描述它

假设我给出了JSON结构:

{
"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}}}