反序列化JSON,然后序列化一部分

时间:2019-09-30 01:20:46

标签: c# json json.net

我在任何地方都找不到我想要的东西。可能我不知道如何正确描述它。

假设我已经给出了JSON结构:

{
"important": {
    "key1": "aaaa",
    "key2": "bbbb",
    "key3": "cccc"   
},
"_meta": {
    "other": {
      "default": "a",
      "something": 1
}}}

我只对important部分感兴趣。

要获取important数据:

string temp = File.ReadAllText(jsonPath);
data = (JObject)JsonConvert.DeserializeObject(temp);
var important = data["important"].Value<JObject>().ToString();
importantData = JsonConvert.DeserializeObject<Dictionary<string, string>>(important);

,它完成了工作。然后,我对importantData进行了一些修改 我想将其保存回文件。我尝试了以下代码:

string json = JsonConvert.SerializeObject(importantData);
data["important"] = json;
string rdyJson = JsonConvert.SerializeObject(data);
File.WriteAllText(jsonPath, rdyJson);

结果我得到:

{"important":"{\"key1\":\"aaaa\",\"key2\":\"bbbb\",\"key3\":\"cccc\"}","_meta":{"other":{"default":"a","something":1}}}

这几乎很好,因为它进行了所有修改,而且还有\ "部分中每个important之前。另一件事是,所有内容都在同一行中,我很乐意像以前一样以一种干净整洁的格式进行保存。

我认为问题出在双重序列化中,但我不知道如何避免。

3 个答案:

答案 0 :(得分:2)

尝试:

JsonConvert.SerializeObject(data, Formatting.Indented)

根据Newtonsoft文档,添加Formatting.Indented将导致输出json字符串被扩展/缩进而不是转义。

https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Formatting.htm

答案 1 :(得分:2)

替换以下行:

string json = JsonConvert.SerializeObject(importantData);
data["important"] = json;

在下一行:

data["important"] = JToken.FromObject(importantData);

答案 2 :(得分:1)

编辑:@Maxim_A在我键入此内容时进行了回答。这个答案本质上就是这里所说的。

问题似乎出在对importantData进行序列化,然后使用字符串表示data["important"]的json时。实际上,您可以将importantData表示为JObject,然后使用它。

这是我使用的代码:

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

由于数据表示为JObject而不是字符串,因此当您再次对其进行序列化时,它不会转义双引号。在您的实现中,它将json键important设置为字符串,而不是实际的json对象。