我在任何地方都找不到我想要的东西。可能我不知道如何正确描述它。
假设我已经给出了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
之前。另一件事是,所有内容都在同一行中,我很乐意像以前一样以一种干净整洁的格式进行保存。
我认为问题出在双重序列化中,但我不知道如何避免。
答案 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对象。