2016-04-08 15 views
1

Ich arbeite an einer WEB-API, die eine JSON-Datei zurückgibt. Ich möchte, dass meine JSON wie diese mögen:Wie kann man Objektfeldnamen in JSON verstecken?

{ 
    "PensionDistribution": [{ 
     "rows": [{ 
      "uniqueName": "Age" 
     }] 
    }, 
    { 
     "columns": [{ 
      "uniqueName": "Year" 
     }, 
     { 
      "uniqueName": "Type" 
     }] 
    }, 
    { 
     "measures": [{ 
      "uniqueName": "AgentID", 
      "aggregation": "count" 
     }] 
    }, 
    { 
     "fields": { 
      "Age": { 
       "type": "number", 
       "caption": "Age" 
      }, 
      "AgentComputedCompleteName": { 
       "type": "string", 
       "caption": "Nom complet encodé de l'agent" 
      }, 
      "AgentID": { 
       "type": "number", 
       "caption": "ID Agent" 
      }, 
      "MatriculeAgent": { 
       "type": "string", 
       "caption": "Matricule agent" 
      }, 
      "Type": { 
       "type": "string", 
       "caption": "Type" 
      }, 
      "TypeKey": { 
       "type": "string", 
       "caption": "Type clé" 
      }, 
      "Year": { 
       "type": "string", 
       "caption": "Année" 
      } 
     } 
    }] 
} 

Also habe ich die Klassen, die meine Daten in der Datenbank in meine JSON konvertieren:

public class PivotConfigData 
{ 
    public class Report 
    { 
     public string Name { get; set; } 
     public List<Row> Rows { get; set; } 
     public List<Column> Columns { get; set; } 
     public List<Measure> Measures { get; set; } 
     public List<Field> Fields { get; set; } 
     public Report() 
     { 
      Name = ""; 
      Rows = new List<Row>(); 
      Columns = new List<Column>(); 
      Measures = new List<Measure>(); 
      Fields = new List<Field>(); 
     } 
    } 
    public class Row 
    { 
     public string UniqueName { get; set; } 
    } 
    public class Column 
    { 
     public string UniqueName { get; set; } 
    } 
    public class Measure 
    { 
     public string UniqueName { get; set; } 
     public string Aggregation { get; set; } 
    } 
    public class Field 
    { 
     public string Name { get; set; } 
     public FieldAttributes Attributes { get; set; } 
    } 
    public class FieldAttributes 
    { 
     public string Type { get; set; } 
     public string Caption { get; set; } 
    } 
} 

Damit ich mit einer JSON-Datei wie folgt erhalten:

Wie Sie sehen können, fügte es den "Namen" hinzu: vor "PensionDistribution", aber das ist keine große Sache. Es ist ein Problem für die "Felder" Sammlung, da es die "Namen" und "Attribute" hinzufügt, wie kann ich diese Eigenschaftsnamen löschen oder verstecken? Ich habe versucht, [JsonProperty ("")] vor meiner Eigenschaft hinzuzufügen, aber es ersetzt "Name": durch "": was nicht das ist, was ich wollte.

Kann mir bitte jemand helfen?

+0

Das Problem, das Sie haben, ist, dass Felder ein Objekt mit Eigenschaften ist, die nach jedem Feld in Ihrem "gewünschten" JSON benannt sind. Daher kann es nicht aus der von der Klasse Report (C#) angegebenen Fields-Auflistung übersetzt werden. Ich würde argumentieren, dass die gewünschte JSON-Struktur, wie Sie sie präsentieren, nicht generisch genug ist. Ich frage mich, wie der Verbraucher es leicht verwenden kann (sie können zum Beispiel keine Sammlung von Feldern erhalten), sondern sie müssen den Zugriff auf jedes der "Felder" -Objekt namens Eigenschaften fest codieren. – andrew

+0

... Wenn überhaupt , die zweite JSON (diejenige, die Sie von der C# bekommen, aber die, die Sie nicht wollen) würde einfacher zu arbeiten sein (sowohl für Sie als auch für den Verbraucher der WebAPI) JMO. – andrew

+0

Zusammenfassung (Entschuldigung) - JSON-Schema sollte nicht zwischen Berichten wechseln.Es sollte eine generische Sammlung von Feldern mit Namen, etc, nicht benannte Eigenschaften für ein Objekt haben .. – andrew

Antwort

1

Verwenden Sie für unerwünschte Eigenschaften Attribut JsonIgnore.

Für den Namen der Änderungseigenschaft verwenden Sie [JsonProperty(PropertyName = "NewName")].

+0

Danke, aber wie kann ich den Namen "Attribute" durch die Eigenschaft Name meiner Feldklasse ersetzen? Ich habe versucht [JsonProperty (Name)], aber es funktioniert nicht – dej

+0

Zeigen Sie Code, wo Sie zu JSON serialisieren. – BWA

+0

Ich nicht mit meinem Code serialisieren, mein Web-API-Controller gibt ein Objekt zurück, das automatisch zu JSON serialisiert wird – dej

1

Anstatt die Attribute von JSON.NET zu verwenden (wodurch Ihr Code davon abhängig ist), können Sie die normalen Serialisierungsattribute von .NET Framework verwenden (DataMemberAttribute, DataContractAttribute, usw.).

Um Eigenschaften von JSON zu ignorieren/entfernen, können Sie sie mit der IgnoreDataMemberAttribute verzieren.

+0

Wenn ich mich nicht irre, schließt Json.NET alle Werte aus, die '' DataMember ''nicht deklarieren, wenn' [DataContract] 'in der Klasse gefunden wurde. – Toxantron

+0

Werfen Sie einen Blick auf diese [Code von Json.NET] (https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs#L322) – Toxantron

+1

@Toxantron yeah vielleicht funktioniert es so. Es ist jedoch besser, explizit anzugeben, dass die Eigenschaft ignoriert wird. Es könnte sein, dass einige vergessen haben, die Immobilie mit einem Attribut zu dekorieren. – Jehof

Verwandte Themen