2013-10-12 3 views
1

Je voudrais une représentation JSON de mon type de classes afin que je puisse les brancher dans un schéma côté client. Voici comment mon côté serveur classe C# ressemble:Sérialiser le type de classe à JSON?

public class Person 
{ 
    public int ID { get; set; } 

    [Required(ErrorMessage = "Name is required.")] 
    public string Name { get; set; } 

    public DateTime Birthday { get; set; } 

    public bool IsMarried { get; set; } 
} 

Comment puis-je sérialiser à cette ?:

{ 
    fields: { 
     "ID": { 
      type: "number" 
     }, 
     "Name": { 
      type: "string", 
      validation: { 
       required: true, 
       message: "Name is required.", 
      } 
     }, 
     "Birthday": { 
      type: "date" 
     }, 
     "IsMarried": { 
      type: "bool" 
     } 
    } 
} 
+0

Pourquoi le JavaScript marque? Vous voulez faire cela sur le serveur, non? – user2736012

+0

http://stackoverflow.com/questions/7167950/how-to-serialize-from-c-sharp-to-json-a-list-containing-a-list-containing-an-arr – mconlin

+0

Essayez-vous de créer json schéma? – PSL

Répondre

2

Il n'y a rien (AFAIK) préconfigurées pour que dans la bibliothèque JSON.NET, mais il est assez simple à mettre en œuvre en utilisant un code de réflexion:

public class StackOverflow_19336832 
{ 
    public class RequiredAttribute : Attribute 
    { 
     public string ErrorMessage { get; set; } 
    } 

    public class Person 
    { 
     public int ID { get; set; } 

     [Required(ErrorMessage = "Name is required.")] 
     public string Name { get; set; } 

     public DateTime Birthday { get; set; } 

     public bool IsMarried { get; set; } 
    } 

    static JObject GetSchema(Type type) 
    { 
     var result = new JObject(); 
     foreach (var prop in type.GetProperties()) 
     { 
      var name = prop.Name; 
      var propType = prop.PropertyType; 
      var field = new JObject(); 
      result.Add(name, field); 
      switch (Type.GetTypeCode(propType)) 
      { 
       case TypeCode.Boolean: 
        field.Add("type", "bool"); 
        break; 
       case TypeCode.Int16: 
       case TypeCode.Int32: 
       case TypeCode.Int64: 
       case TypeCode.UInt16: 
       case TypeCode.UInt32: 
       case TypeCode.UInt64: 
       case TypeCode.Double: 
       case TypeCode.Single: 
        field.Add("type", "number"); 
        break; 
       case TypeCode.String: 
        field.Add("type", "string"); 
        break; 
       case TypeCode.DateTime: 
        field.Add("type", "date"); 
        break; 
       default: 
        throw new ArgumentException("Don't know how to generate schema for property with type " + propType.FullName); 
      } 

      var req = prop.GetCustomAttributes(typeof(RequiredAttribute), false).FirstOrDefault() as RequiredAttribute; 
      if (req != null) 
      { 
       var validation = new JObject(); 
       field.Add("validation", validation); 
       validation.Add("required", true); 
       if (!string.IsNullOrEmpty(req.ErrorMessage)) 
       { 
        validation.Add("message", req.ErrorMessage); 
       } 
      } 
     } 

     return result; 
    } 

    public static void Test() 
    { 
     var schema = GetSchema(typeof(Person)); 
     Console.WriteLine(schema); 
    } 
} 
+0

Il existe JsonSchemaGenerator qui va créer un JsonSchema à partir d'un type. Vous pouvez alors ToString() le JsonSchema pour obtenir son JSON - http://james.newtonking.com/json/help/index.html?topic=html/AllMembers_T_Newtonsoft_Json_Schema_JsonSchemaGenerator.htm –

+0

C'est génial, merci de le signaler! – carlosfigueira

-1

Jetez un oeil ici pour quelques idées sur la façon d'utiliser JavaScriptSerializer pour obtenir le Travail terminé. Il existe également d'autres sérialiseurs, mais celui-ci fonctionne bien et le lien offre des exemples d'implémentation et d'utilisation.

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

+0

L'OP tente de créer un schéma JSON à partir de sa définition de classe, et non de sérialiser une instance de la classe. Le lien que vous avez cité ne montre pas comment utiliser JavaScriptSerializer pour cela. –

+0

Ahh, ma mauvaise. Merci d'avoir fait remarquer cela! – Haney