2016-12-03 3 views
0

Ich möchte eine Nachricht serialisieren, die über das AWS SNS-Modul gesendet werden soll.C# - JSON-Serialisierung für SNS

public async Task<string> jsonConvert(string message) 
{ 
    datamessage datamessage = new datamessage { message = message }; 
    gcmMessage lGcm = new gcmMessage { data = datamessage }; 
    MessageDto messageDto = new MessageDto { GCM = JsonConvert.SerializeObject(lGcm) }; 
    var msg = JsonConvert.SerializeObject(messageDto); 
    return msg; 
} 

ich diesen Code für die gleiche bin mit aber der Rückgabewert ist

{"GCM":"{\"data\":{\"message\":\"TestMsg\"}}"} 

Aber ich will es als

{"default": "TestMsg", "GCM": "{ \"data\": { \"message\": \"TestMsg\" } }"} 

Jede Hilfe würde geschätzt.

Antwort

0

Die Struktur für die Json Sie tot erstellen möchten sollte wie folgt aussehen:

Klassen:

public class Data 
{ 
    [JsonProperty("message")] 
    public string Message { get; set; } 
} 

public class GCM 
{ 
    [JsonProperty("data")] 
    public Data Data { get; set; } 
} 

public class RootObject 
{ 
    [JsonProperty("default")] 
    public string Default { get; set; } 

    [JsonProperty("GCM")] 
    public GCM GCM { get; set; } 
} 

die Nachricht erstellen:

RootObject rootObject = new RootObject 
{ 
    Default = "TestMsg", 
    GCM = new GCM { Data = new Data { Message = "TestMsg" } } 
}; 

Serialize:

var serialized = JsonConvert.SerializeObject(rootObject); 

Ergebnis

"{\"default\":\"TestMsg\",\"GCM\":{\"data\":{\"message\":\"TestMsg\"}}}" 

In Ihrer Methode würde es so aussehen:

public async Task<string> jsonConvert(string message) 
{ 
    RootObject rootObject = new RootObject 
    { 
     Default = message, 
     GCM = new GCM { Data = new Data { Message = message } } 
    }; 

    var msg = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(rootObject)); 
    return msg; 
} 
+1

Gut, dass Sie zeigte auch, wie 'JsonProperty' verwenden Attribut stattdessen öffentliche Eigenschaften der Namensgebung in Kleinbuchstaben. :) –

+0

Warum starten Sie einen neuen Thread für die Serialisierung? Wäre die Thread-Erstellung/Synchronisation nicht teurer? –

+0

@ChristianGollhardt 'Task.Factory.StartNew' erstellt nicht unbedingt einen neuen Thread. – Jim