2016-03-30 3 views
0

Davor habe ich IDataContractSurrogate zum Serialisieren meiner Daten verwendet, aber es ist nicht kompatibel mit CPL (portable class librairy), daher verwende ich Newtonsoft jetzt.Besetzungsart mit Newtonsoft.Json

Aber ich habe eine ObservableCollection Art werfen mit zur Liste:

myobj [ { id:1, name="test1", value="test_1"}, { id:2, name="test2", value="test_2"}] 

zu myobj ["test1", "test2"],

Ist es möglich? Ich habe versucht, wie folgt aus:

public class ccrUser : DefaultContractResolver { // Newtonsoft.Json.Serialization.IContractResolver 

     private bool toSerialise; 
     public static readonly ccrUser Instance = new ccrUser(true); 

     /// <summary>Constructeur</summary> 
     /// <param name="pToSerialise">Indique le sens qui sera utlisé (les API ne donnent pas le même format en GET qu'elles attendent en POST).</param> 
     public ccrUser(bool pToSerialise) : base() { toSerialise = pToSerialise; } 

     protected override JsonContract CreateContract(Type objectType) { 
      var contract = base.CreateContract(objectType); 
      if ((toSerialise) && (objectType == typeof(ObservableCollection<tblGroup>))) { 
       //contract.Converter = new Newtonsoft.Json.Converters.CustomCreationConverter<string>(); 
       return base.CreateArrayContract(objectType); 
      } else 
       return contract; 
     } 
     protected override List<MemberInfo> GetSerializableMembers(Type objectType) { 
      var defaultMembers = base.GetSerializableMembers(objectType); 
      if ((toSerialise) && (objectType == typeof(ObservableCollection<tblGroup>))) { 
       return defaultMembers; 
      } else 
       return defaultMembers; 
     } 


     protected override JsonConverter ResolveContractConverter(Type objectType) { 
      if (objectType == typeof(ObservableCollection<tblGroup>)) { 
       return null; // pretend converter is not specified 
      } 
      return base.ResolveContractConverter(objectType); 
     } 

     /// <summary>JSON value provider that always returns a static value</summary> 
     public class StaticValueProvider : IValueProvider { 
      private readonly object _staticValue; 
      public StaticValueProvider(object staticValue) { _staticValue = staticValue; } 
      public void SetValue(object target, object value) { throw new NotSupportedException(); } 
      public object GetValue(object target) { return _staticValue; } 
     } 

     protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { 
      JsonProperty property = base.CreateProperty(member, memberSerialization); 
      if ((toSerialise) && (property.PropertyType == typeof(ObservableCollection<tblGroup>))) { 
      } 
      return property; 
     } 
    } 

kann aber die Lösung nicht finden.

Grüße

+0

Warum nicht deserialisieren 'myobj' wie es ist, und dann etwas in Getter andere Eigenschaft zurückgeben, was Sie brauchen? Oder wenn das Problem entgegengesetzt ist (serialisieren), dann serialisieren Sie eine andere Eigenschaft (die Konvertierung eingibt) statt der ursprünglichen. – Sinatr

+0

Wegen der Kollision des Namens. In der Serialisierung erfordert, dass "Gruppen" ist es ein Array von String und Deserialisierung erfordert, dass "Gruppen" ist es ein Array von Objekten. – david

Antwort

0

Statt Gießen während der Serialisierung/Deserialisierung selbst können Sie eine andere Eigenschaft serialisieren/deserialisieren (eines anderen Typs):

// serialize only marked members 
[JsonObject(MemberSerialization = MemberSerialization.OptIn)] 
public class SerializableObject 
{ 
    // original property: not serialized 
    public TypeA PropertyA { get; set; } 

    [JsonProperty(nameof(PropertyA))] 
    public TypeB PropertyB 
    { 
     get 
     { 
      // convert PropertyA value to TypeB 
      return (TypeB)PropertyA; 
     } 
     set 
     { 
      // convert TypeB to TypeA and set PropertyA value 
      PropertyA = (TypeA)value; 
     } 
    } 
} 

PropertyB (kann private sein, wenn Sie mögen) ist nur dann verwendet Serialisierung/Deserialisierung PropertyA Wert als ein anderer Typ.

+0

Das funktioniert, aber ich denke, es ist nicht beautuful: [DataMember (Name = "Gruppen")] öffentliche IEnumerable groupsApi { get {return (_groups! = Null))? (aus c in (ObservableCollection ) _Gruppen wählen c.value) .ToList(): null; } set {_groups = new ObservableCollection (); value.ForEach ((a) => {_groups.Add (((Newtonsoft.Json.Linq.JObject) a) .ToObject ());}); } } öffentliche ObservableCollection Gruppen {get {return _groups; } set {_groups = Wert; }} – david

0

Es ist ein Übersetzungsfehler, kann es nicht Liste < string> zu IEnumerable analysieren < tblGroup>:

[DataMember(Name ="groups")] 
public List<string> groupsApi { get { return (from c in (ObservableCollection<tblGroup>)_groups select c.value).ToList(); } set { _groups = new ObservableCollection<tblGroup>(value); } } 
public ObservableCollection<tblGroup> groups { get { return _groups; } set { _groups = value; } } 
Verwandte Themen