2015-02-04 19 views
23

Dzwoniąc Newtonsoft.Json.JsonConvert.SerializeObject(myObject) dostaję klucze i wartości ujęty w cudzysłowy tak:Powiedz json .net napisać apostrofu zamiast podwójnej cytatem podczas szeregowania obiektów

{"key" : "value"}

chciałbym im być ujęte w pojedyncze cudzysłowy tak:

{'key' : 'value'}

Czy można zrobić za pomocą JSON .NET?

+0

To pytanie już zadane. http://stackoverflow.com/questions/13541998/how-to-encode-the-single-quote-apostrophe-in-json-net. Sprawdź to pytanie, aby sprawdzić, czy ci to pomaga. – Bearcat9425

+2

niezbyt ładna rzecz, ale działa: 'json.Replace (" \ "", "\" ");' – stefankmitph

+0

Myślę, że możesz osiągnąć swój cel za pomocą rozwiązania podobnego do tego zastosowanego w tej [odpowiedź] (http://stackoverflow.com/a/9280598/982431) .To rozwiązanie przejdzie od utworzenia niestandardowej klasy 'JsonConverter', która zapisuje wartości surowe i otacza je pojedynczymi cudzysłowami. – HuorSwords

Odpowiedz

25

Tak, jest to możliwe. Jeśli użyjesz jawnie zamiast JsonTextWriter zamiast używać JsonConvert.SerializeObject(), możesz ustawić QuoteChar na pojedynczy cytat.

var obj = new { key = "value" }; 

StringBuilder sb = new StringBuilder(); 
using (StringWriter sw = new StringWriter(sb)) 
using (JsonTextWriter writer = new JsonTextWriter(sw)) 
{ 
    writer.QuoteChar = '\''; 

    JsonSerializer ser = new JsonSerializer(); 
    ser.Serialize(writer, obj); 
} 

Console.WriteLine(sb.ToString()); 

wyjściowa:

{'key':'value'} 

Fiddle: https://dotnetfiddle.net/LGRl1k

Należy pamiętać, że używanie apostrofów wokół kluczy i wartości w JSON jest uważany niestandardowe (patrz JSON.org) i może powodować problemy dla analizatorów, które ściśle przestrzegają normy.

1
json = Regex.Replace(json, @"\\\\|\\(""|')|(""|')", match => { 
    if (match.Groups[1].Value == "\"") return "\""; // Unescape \" 
    if (match.Groups[2].Value == "\"") return "'"; // Replace " with ' 
    if (match.Groups[2].Value == "'") return "\\'"; // Escape ' 
    return match.Value;        // Leave \\ and \' unchanged 
}); 

Wyrażenie mecze każdy z podciągów \\, \", \', ", '. Przechwytuje wyciągnięte cudzysłów do grupy 1, a puste cudzysłów do grupy 2. Funkcja lambda następnie zwraca odpowiednie podstawienie, aby przekształcić łańcuch podwójnego cudzysłowu w pojedynczy ciąg cudzysłowu.