Estoy usando JavaScriptSerializer para serializar objetos en el archivo al formato JSON. Pero el archivo de resultados no tiene formato legible. ¿Cómo puedo permitir que el formato obtenga un archivo legible?¿Cómo establecer el formato con JavaScriptSerializer cuando se serializa JSON?
Respuesta
Parece ser que no hay una herramienta incorporada para formatear la salida del serializador JSON.
Supongo que la razón por la que esto sucedió es la minimización de los datos que enviamos a través de la red.
¿Está seguro de que necesita datos formateados en el código? ¿O desea analizar JSON solo durante la depuración?
Hay una gran cantidad de servicios en línea que ofrecen dicha funcionalidad: 1, 2. O aplicación independiente: JSON viewer.
Pero si necesita formatear dentro de la aplicación, puede escribir appropriate code usted mismo.
Usted podría utilizar JSON.NET serializador, es compatible con el formato JSON
string body = JsonConvert.SerializeObject(message, Formatting.Indented);
Yon puede descargar a través de this package NuGet.
Aquí está mi solución que no requiere el uso de JSON.NET y es más simple que el código vinculado por Alex Zhevzhik.
using System.Web.Script.Serialization;
// add a reference to System.Web.Extensions
public void WriteToFile(string path)
{
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(this);
string json_pretty = JSON_PrettyPrinter.Process(json);
File.WriteAllText(path, json_pretty);
}
y aquí está el formateador
class JSON_PrettyPrinter
{
public static string Process(string inputText)
{
bool escaped = false;
bool inquotes = false;
int column = 0;
int indentation = 0;
Stack<int> indentations = new Stack<int>();
int TABBING = 8;
StringBuilder sb = new StringBuilder();
foreach (char x in inputText)
{
sb.Append(x);
column++;
if (escaped)
{
escaped = false;
}
else
{
if (x == '\\')
{
escaped = true;
}
else if (x == '\"')
{
inquotes = !inquotes;
}
else if (!inquotes)
{
if (x == ',')
{
// if we see a comma, go to next line, and indent to the same depth
sb.Append("\r\n");
column = 0;
for (int i = 0; i < indentation; i++)
{
sb.Append(" ");
column++;
}
} else if (x == '[' || x== '{') {
// if we open a bracket or brace, indent further (push on stack)
indentations.Push(indentation);
indentation = column;
}
else if (x == ']' || x == '}')
{
// if we close a bracket or brace, undo one level of indent (pop)
indentation = indentations.Pop();
}
else if (x == ':')
{
// if we see a colon, add spaces until we get to the next
// tab stop, but without using tab characters!
while ((column % TABBING) != 0)
{
sb.Append(' ');
column++;
}
}
}
}
}
return sb.ToString();
}
}
¿Por qué usar 'IDisposable'? ¿Por qué no simplemente hacer 'Process' un método estático? – tenfour
@tenfour: tiene toda la razón. Este fragmento de código proviene de un bloque más grande que se simplificó para stackoverflow ... Lo simplificaré aún más. –
¡No es una solución para todos! ¡Tendría conflictos de imagen de página (o formato) si su proyecto es un .NET 4 o si su proyecto no es una designación web! Observe que está utilizando System.Web.Extensions (¡necesita .NET4.5!) Para traer System.Web.Script.Serialization !! Para una solución concreta, debe usar NuGet para adquirir Newtonsoft y usar JsonConvert.SerializeObject –
también quería ser capaz de tener el formato JSON sin depender de un componente de terceros. La solución de Mark Lakata funcionó bien (gracias a Mark), pero quería que los corchetes y las tabulaciones fueran como los del enlace de Alex Zhevzhik. Así que aquí está una versión modificada del código de Mark que funciona de esa manera, en caso de que alguien más lo quiere:
/// <summary>
/// Adds indentation and line breaks to output of JavaScriptSerializer
/// </summary>
public static string FormatOutput(string jsonString)
{
var stringBuilder = new StringBuilder();
bool escaping = false;
bool inQuotes = false;
int indentation = 0;
foreach (char character in jsonString)
{
if (escaping)
{
escaping = false;
stringBuilder.Append(character);
}
else
{
if (character == '\\')
{
escaping = true;
stringBuilder.Append(character);
}
else if (character == '\"')
{
inQuotes = !inQuotes;
stringBuilder.Append(character);
}
else if (!inQuotes)
{
if (character == ',')
{
stringBuilder.Append(character);
stringBuilder.Append("\r\n");
stringBuilder.Append('\t', indentation);
}
else if (character == '[' || character == '{')
{
stringBuilder.Append(character);
stringBuilder.Append("\r\n");
stringBuilder.Append('\t', ++indentation);
}
else if (character == ']' || character == '}')
{
stringBuilder.Append("\r\n");
stringBuilder.Append('\t', --indentation);
stringBuilder.Append(character);
}
else if (character == ':')
{
stringBuilder.Append(character);
stringBuilder.Append('\t');
}
else
{
stringBuilder.Append(character);
}
}
else
{
stringBuilder.Append(character);
}
}
}
return stringBuilder.ToString();
}
- 1. ¿Cómo localizar cuando se serializa JSON?
- 2. Generics/JSON JavaScriptSerializer C#
- 3. Serializar diccionarios con JavaScriptSerializer
- 4. ¿Cómo se crea el formato json con group-concat mysql?
- 5. JavaScriptSerializer con tipo personalizado
- 6. ¿Cómo obtengo el formato JSON en .NET usando C#?
- 7. cómo devolver el formato json desde ODATA?
- 8. XmlAttribute/XmlElement equivalent for JavaScriptSerializer
- 9. JSON.NET JsonConvert vs .NET JavaScriptSerializer
- 10. reemplazar el JavascriptSerializer incorporado de WCF con el serializador json de Newtonsoft Json.Net
- 11. ¿Cómo se escribe/serializa el código de Ruby?
- 12. ¿Cómo consumir el formato JSON con ActiveResource de ruby?
- 13. convertir el formato JSON fecha
- 14. Cómo establecer el formato JSON a atributos de datos HTML5 en el jQuery
- 15. ¿Gson serializa POJO con el valor raíz incluido?
- 16. Cómo establecer Request.IsAuthenticated en true cuando no se usa FormsAuthentication.RedirectFromLoginPage?
- 17. JSONKit: crea una cadena con formato json
- 18. Escapar citas con JavaScriptSerializer en ASP.NET MVC3
- 19. Flotador de formato con módulo json estándar
- 20. Escribir JSON con formato en Node.js
- 21. Cómo establecer el tipo de columna cuando se usa EPPlus
- 22. ¿Un objeto serializable siempre se serializa cuando se coloca en un paquete?
- 23. Cómo refactorizar una clase que se serializa en .NET?
- 24. ¿Puede JavaScriptSerializer excluir propiedades con valores nulos/predeterminados?
- 25. "El valor no puede ser nulo" error al deserializar json usando C#/JavaScriptSerializer
- 26. ¿Cómo establecer el formato predeterminado para una ruta en Rails?
- 27. Formato JSON para jQuery UI Autocompletar
- 28. ¿Cómo convierto una matriz bidimensional C# a un objeto JSON?
- 29. Establecer el formato de moneda para la celda de Excel que se creó con ExcelPackage
- 30. ¿Cómo se utiliza un archivo JSON con weka
Incluso puede configurar la configuración de formato deseada JsonConvert.SerializeObject (mensaje, Newtonsoft.Json.Formatting.Indented, nueva JsonSerializerSettings {ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()}); –