2016-08-15 4 views
0

Gibt es sowieso eine C# -Klasse und konvertieren Sie jede Eigenschaft in ein String-Array von [JsonPropertyName, Wert], ohne JSON über Zeichenfolgen zu erstellen. Ich habe versucht, das Objekt mit newtonsoft.Json zu JSON zu serialisieren, aber ich kann nicht die Eigenschaften auf die gleiche Weise wie die gewünschte Ausgabe erscheinen.Konvertieren von Klasseneigenschaften in ein Array von [JsonPropertyName, Value]

public class UserCredentials 
{ 
    [JsonProperty("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username")] 
    public string Username; 

    [JsonProperty("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Password")] 
    public string Password; 
} 

Wunsch JSON Ausgabe:

{"name":"setParameterValues", 
    "parameterValues": [ 
     ["InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username", "[email protected]"], 
     ["InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Password", "hello"] 
    ] 
} 

Antwort

0

Sie können das Objekt in das Array von Eigenschaften konvertieren und dann serialisiert. Etwas wie folgt aus:

public class Test 
{ 
    [JsonProperty("TestJsonString")] 
    public string TestFieldString { get; set; } 

    [JsonProperty("TestJsonInt")] 
    public int TestFieldInt { get; set; } 

    public int TestFieldInt2 { get; set; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var data = new Test() {TestFieldInt = 1, TestFieldString = "11"}; 
     var testArray = data.GetType().GetProperties() 
      .Where(x => x.GetCustomAttributes(true).Any(attr => attr is JsonPropertyAttribute)) 
      .Select(x => new [] 
      { 
       (x.GetCustomAttributes(typeof(JsonPropertyAttribute), true).Single() as JsonPropertyAttribute).PropertyName, 
       x.GetGetMethod().Invoke(data, null) == null ? "" : x.GetGetMethod().Invoke(data, null).ToString() 
      }); 
     var serialized = JsonConvert.SerializeObject(testArray); 
    } 
} 
0

Sie JSON Eigenschaft haben können und den Wert, wie Sie in der Frage gestellt, und nach meinem Verständnis, mit dem Einsatz von Newtonsoft.Json wie unten,

string x = JsonConvert.SerializeObject([YourObject],Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead}); 
1

können Sie Erstellen Sie einen benutzerdefinierten JSON-Serializer. Für einige Beispiele, überprüfen Sie diese Verbindungen (link1, link2).

Hier ist, wie Ihr Code aussehen kann (es ist nur zu entwerfen, Sie Reflexion richtig verwenden):

private class PropertyNamesSerializer : JsonConverter 
    { 
     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      writer.WriteStartObject(); 
      writer.WritePropertyName("name"); 
      writer.WriteValue("setParameterValues"); 
      writer.WritePropertyName("parameterValues"); 
      writer.WriteStartArray(); 
      writer.WriteStartObject(); 
      foreach (var property in value.GetType().GetProperties()) 
      { 
       var attribute = property.GetCustomAttribute<JsonPropertyAttribute>(); 
       writer.WritePropertyName(attribute.PropertyName); 
       writer.WriteValue(property.GetValue(value)); 
      } 
      writer.WriteEndObject(); 
      writer.WriteEndArray(); 
      writer.WriteEndObject(); 
     } 
    // other methods 

Verbrauch:

[JsonConverter(typeof(PropertyNamesSerializer))] 
    public class UserCredentials 
    { 
     [JsonProperty("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username")] 
     public string Username { get; set; } 

     [JsonProperty("InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Password")] 
     public string Password { get; set; } 
    } 

    private static void Main(string[] args) 
    { 

     Console.WriteLine(JsonConvert.SerializeObject(new UserCredentials() {Username = "test", Password = "something"})); 
    } 
Verwandte Themen