After writing the JSON into the file using
File.WriteAllText(fileName, JsonConvert.SerializeObject(jsonToWrite, Formatting.Indented)).
I am getting a tailing space after every ":". How to avoid it?
After writing the JSON into the file using
File.WriteAllText(fileName, JsonConvert.SerializeObject(jsonToWrite, Formatting.Indented)).
I am getting a tailing space after every ":". How to avoid it?
The code that adds the space is located in JsonTextWriter.WriteIndentSpace, and is called by the standard JsonWriter.
One possible option is to write your own JsonTextWriter derived class, override WriteIndentSpace and do nothing in it.
class MyWriter : JsonTextWriter
{
public MyWriter(TextWriter sw) : base(sw)
{ }
protected override void WriteIndentSpace()
{ }
}
You then need to write custom serialization code to actually use this writer
static string Convert(object value, JsonSerializerSettings settings)
{
JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
StringBuilder sb = new StringBuilder(256);
StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture);
using (var jsonWriter = new MyWriter(sw))
{
jsonWriter.Formatting = jsonSerializer.Formatting;
jsonSerializer.Serialize(jsonWriter, value, null);
}
return sw.ToString();
}
You can then call it with whatever settings you want, and an IndentSpace will never be inserted.
var json = Convert(myObject, new JsonSerializerSettings{ Formatting = Formatting.Indented });
Some of the code could be simplified if you know exactly what settings you want to use every time.
Replace ": " by ":" in json content with string.Replace
string fileName = "file.txt";
string jsonFromSerialization = "{\n\t\"foo\": \"bar\",\n\t\"bar\": \"foo\"\n}"; //JsonConvert.SerializeObject
jsonFromSerialization = jsonFromSerialization.Replace("\": \"", "\":\"");
File.WriteAllText(fileName, jsonFromSerialization);
Replace "<any number of whitespaces>:<any number of whitespaces>"
eg. " : "
by ":" in json content with Regex.Replace
string fileName = "file.txt";
string jsonFromSerialization = "{\n\t\"foo\" : \"bar\",\n\t\"bar\" : \"foo\"\n}"; //JsonConvert.SerializeObject
string pattern = "\"\\s*:\\s*\"";
jsonFromSerialization = Regex.Replace(jsonFromSerialization, pattern, "\":\"");
File.WriteAllText(fileName, jsonFromSerialization);
Another approach. Thanks to Jon Skeet for his suggestion. In this example validates special strings in the value of a key.
eg.
{"foo": "xyz\": ","bar" : "foo"}
Code
string JsonReplace(string json)
{
string pattern = @"(\s*""\w+"")\s*:\s*";
foreach (Match m in Regex.Matches(json, pattern))
{
json = json.Replace(m.Value, m.Value.Replace(" ", string.Empty));
}
return json;
}
string fileName = "file.txt";
var data = new
{
foo = "xyz\": ",
bar = "foo"
};
string jsonFromSerialization = JsonConvert.SerializeObject(data);
jsonFromSerialization = JsonReplace(jsonFromSerialization);
File.WriteAllText(fileName, jsonFromSerialization);