2016-05-24 3 views
1

JSON désiré:Comment cartographier la propriété personnalisée JSON

"MyRootAttr": { 
    "value": "My Value" 
} 

définition de la propriété dans la classe:

public string MyRootAttr { get; set; } 

Ainsi, la question est, sans définir une nouvelle classe, avec une seule propriété de chaîne , comment puis-je atteindre le JSON que je veux?

+1

Peut-être un type anonyme aiderait: https://msdn.microsoft.com/en-us/library/bb397696.aspx –

+0

S'il vous plaît postent vous avez essayé jusqu'à présent. – NickHeidke

Répondre

2

Si vous ne voulez pas modifier la structure de votre classe, vous peut utiliser une coutume JsonConverter pour obtenir le résultat souhaité:

class WrappedStringConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(string)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     string s = (string)value; 
     JObject jo = new JObject(new JProperty("value", s)); 
     jo.WriteTo(writer); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jo = JObject.Load(reader); 
     return (string)jo["value"]; 
    } 
} 

pour l'utiliser, ajoutez un attribut [JsonConverter] à votre propriété de chaîne comme ceci:

class Foo 
{ 
    [JsonConverter(typeof(WrappedStringConverter))] 
    public string MyRootAttr { get; set; } 
} 

démo aller-retour ici: https://dotnetfiddle.net/y1y5vb

2

Comme je l'ai mentionné dans mon commentaire, un anonymous type pourrait aider à accomplir ceci:

var myObj = new { MyRootAttr = new { value = "My Value" } }; 
JavaScriptSerializer js = new JavaScriptSerializer(); 
string json = js.Serialize(myObj); //{"MyRootAttr":{"value":"My Value"}} 

Avec Json.net:

string json = JsonConvert.SerializeObject(myObj); //{"MyRootAttr":{"value":"My Value"}} 
1

Utiliser le formatage de chaîne ou de construire la chaîne JSON manuellement.

var str = String.Format("\"MyRootAttr\": {{ \"value\": \"{{0}}\" }}", MyRootAttr); 
+0

var str = String.Format ("\" MyRootAttr \ ": {{\" valeur \ ": \" {{0}} \ "}}", MyRootAttr); – Dexion