Как получить форматированный JSON в .NET с помощью C #?

Я использую синтаксический анализатор .NET JSON и хотел бы сериализовать мой файл конфигурации, чтобы он был читабельным. Поэтому вместо:

{"blah":"v", "blah2":"v2"} 

Мне хотелось бы что-то приятнее:

 { "blah":"v", "blah2":"v2" } 

Мой код выглядит примерно так:

 using System.Web.Script.Serialization; var ser = new JavaScriptSerializer(); configSz = ser.Serialize(config); using (var f = (TextWriter)File.CreateText(configFn)) { f.WriteLine(configSz); f.Close(); } 

Вам вряд ли удастся выполнить это с помощью JavaScriptSerializer.

Попробуйте JSON.Net .

С небольшими изменениями от примера JSON.Net

 using System; using Newtonsoft.Json; namespace JsonPrettyPrint { internal class Program { private static void Main(string[] args) { Product product = new Product { Name = "Apple", Expiry = new DateTime(2008, 12, 28), Price = 3.99M, Sizes = new[] { "Small", "Medium", "Large" } }; string json = JsonConvert.SerializeObject(product, Formatting.Indented); Console.WriteLine(json); Product deserializedProduct = JsonConvert.DeserializeObject(json); } } internal class Product { public String[] Sizes { get; set; } public decimal Price { get; set; } public DateTime Expiry { get; set; } public string Name { get; set; } } } 

Результаты

 { "Sizes": [ "Small", "Medium", "Large" ], "Price": 3.99, "Expiry": "\/Date(1230447600000-0700)\/", "Name": "Apple" } 

Документация: Сериализация объекта

Более короткий пример кода для библиотеки Json.Net

 private static string FormatJson(string json) { dynamic parsedJson = JsonConvert.DeserializeObject(json); return JsonConvert.SerializeObject(parsedJson, Formatting.Indented); } 

Если у вас есть строка JSON и вы хотите «префлотировать» ее, но не хотите сериализовать ее в известном C #-типе, то следующее делает трюк (используя JSON.NET):

 using System; using System.IO; using Newtonsoft.Json; class JsonUtil { public static string JsonPrettify(string json) { using (var stringReader = new StringReader(json)) using (var stringWriter = new StringWriter()) { var jsonReader = new JsonTextReader(stringReader); var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented }; jsonWriter.WriteToken(jsonReader); return stringWriter.ToString(); } } } 

Самая короткая версия для преуменьшения существующего JSON: (изменить: с помощью JSON.net)

 JToken.Parse("mystring").ToString() 

Входные данные:

 {"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }} 

Вывод:

 { "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ { "value": "New", "onclick": "CreateNewDoc()" }, { "value": "Open", "onclick": "OpenDoc()" }, { "value": "Close", "onclick": "CloseDoc()" } ] } } } 

Чтобы довольно печатать объект:

 JToken.FromObject(myObject).ToString() 

Oneliner с использованием Newtonsoft.Json :

 string prettyJson = JToken.Parse(uglyJsonString).ToString(Formatting.Indented); 

Вы можете использовать следующий стандартный метод для форматирования Json

JsonReaderWriterFactory.CreateJsonWriter (stream streamа, кодирование кодирования, bool ownsStream, bool indent, строка indentChars)

Только установите «indent = true»

Попробуйте что-то вроде этого

  public readonly DataContractJsonSerializerSettings Settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true }; public void Keep(TValue item, string path) { try { using (var stream = File.Open(path, FileMode.Create)) { var currentCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; try { using (var writer = JsonReaderWriterFactory.CreateJsonWriter( stream, Encoding.UTF8, true, true, " ")) { var serializer = new DataContractJsonSerializer(type, Settings); serializer.WriteObject(writer, item); writer.Flush(); } } catch (Exception exception) { Debug.WriteLine(exception.ToString()); } finally { Thread.CurrentThread.CurrentCulture = currentCulture; } } } catch (Exception exception) { Debug.WriteLine(exception.ToString()); } } 

Обратите внимание на линии

  var currentCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; .... Thread.CurrentThread.CurrentCulture = currentCulture; 

Вы должны использовать InvariantCulture, чтобы избежать исключения во время десериализации на компьютерах с разными региональными настройками. Например, иногда их вызывают недопустимый формат double или DateTime .

Для десериализации

  public TValue Revive(string path, params object[] constructorArgs) { try { using (var stream = File.OpenRead(path)) { var currentCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; try { var serializer = new DataContractJsonSerializer(type, Settings); var item = (TValue) serializer.ReadObject(stream); if (Equals(item, null)) throw new Exception(); return item; } catch (Exception exception) { Debug.WriteLine(exception.ToString()); return (TValue) Activator.CreateInstance(type, constructorArgs); } finally { Thread.CurrentThread.CurrentCulture = currentCulture; } } } catch { return (TValue) Activator.CreateInstance(typeof (TValue), constructorArgs); } } 

Благодаря!

Сначала я хотел добавить комментарий к сообщению Duncan Smart, но, к сожалению, у меня еще недостаточно репутации, чтобы оставлять комментарии. Поэтому я попробую его здесь.

Я просто хочу предупредить о побочных эффектах.

JsonTextReader внутренне анализирует json на типизированные JTokens, а затем сериализует их обратно.

Например, если ваш оригинальный JSON был

  { "double":0.00002, "date":"\/Date(1198908717056)\/"} 

После префикса вы получаете

 { "double":2E-05, "date": "2007-12-29T06:11:57.056Z" } 

Конечно, обе строки json эквивалентны и десериализуются для структурно равных объектов, но если вам нужно сохранить исходные строковые значения, вам нужно принять это во внимание

  • DataTable для JSON
  • jQuery отправляет действительный json в тело запроса
  • Как преобразовать escape-строку JSON в объект JSON?
  • Массивы декодирования Swift JSONDecode терпят неудачу, если сбой одного элемента
  • Основной пример использования .ajax () с JSONP?
  • Получение JSONObject из JSONArray
  • Проблема при получении текста в формате JSON, содержащем разрывы строк с помощью jQuery
  • Android-создать JSON-массив и объект JSON
  • JSON.Net Xml Сериализация неправильно понимает массивы
  • Deserialize json с известными и неизвестными полями
  • Серийный цикл ActiveRecord с использованием JSON вместо YAML
  • Давайте будем гением компьютера.