[英]Cast type with Newtonsoft.Json
以前,我使用IDataContractSurrogate來序列化我的數據,但它與CPL(便攜式類庫)不兼容,所以我現在使用Newtonsoft。
但是,我必須將ObservableCollection類型轉換為List:
myobj [ { id:1, name="test1", value="test_1"}, { id:2, name="test2", value="test_2"}]
到myobj ["test1", "test2"],
可能嗎 ? 我這樣嘗試過:
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;
}
}
但找不到解決方案。
問候
您可以序列化/反序列化另一個屬性(另一種類型),而不是在序列化/反序列化過程本身進行轉換時:
// 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
(如果願意,可以是private
)僅用於序列化/反序列化PropertyA
值作為另一種類型。
出現編譯錯誤,它無法將List <string>解析為IEnumerable <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; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.