当一个属性可以有不同的类型时,如何序列化datcontract 's成员

本文关键字:序列化 datcontract 成员 类型 一个 属性 | 更新日期: 2023-09-27 18:08:18

我有以下json(由API提供):

[
    {
        "type": "text",
        "values": [
            {
                "value": "Text that is in textfield"
            }
        ]
    },
    {
        "type": "category",
        "values": [
            {
                "value": {
                    "text": "Category title",
                    "color": "#000000"
                }
            }
        ]
    }
]

当值时,如何将这样的对象表示为强类型(c#要求)。价值是动态的吗?

以下是关于我的问题的更多信息:尝试将两个不同的类型映射到一个值

但是我想让这个新问题简洁。


很抱歉,但是我还是不能让这个工作!有关于如何序列化它的例子吗?

我现在有这段代码要序列化:

[DataContract]
public class MyField
{
    [DataMember]
    public List<MyValue> values { get; set; }
}
[DataContract]
public class MyValue
{
    [DataMember]
    public object value { get; set; } // This will crash because it needs to be both a string and an object with text,color properties??
}
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response)))
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MyField>));
    return (List<MyField>)serializer.ReadObject(stream);
}

,但它崩溃的值。值位,因为它不能强制转换为强类型…

////编辑////

肯定有人以前这样做过!!

当一个属性可以有不同的类型时,如何序列化datcontract 's成员

基本上你要把Value定义为Dictionary,因为它是动态的。

至于如何序列化它,这取决于您正在使用的序列化器。我个人更喜欢JSON。NET从Newtonsoft。您可以在SO上找到大量关于如何将字典序列化为JSON的示例。

这是一个使用datacontractjsonserializer:用datacontractjsonserializer将JSON反序列化到Dictionary

下面是一个使用json.net的例子:我如何将JSON反序列化为一个简单的Dictionary<string,string>在ASP.NET ?

下面是如何用JSON反序列化数组中的混合类型。并且仍然保持强类型。关键是JSONConverter实现,它基本上指示序列化器将反序列化为字符串或类型(Attribute)。
public static void Main()
{
    using (FileStream stream = File.OpenRead("TextFile1.txt"))
    using (StreamReader reader = new StreamReader(stream))
    {
        JsonSerializer ser = new JsonSerializer();
        List<MyField> result = ser.Deserialize<List<MyField>>(new JsonTextReader(reader));
    }       
}


public class MyField
{
    public string type { get; set; }        
    public List<MyValue> values { get; set; }
}

public class MyValue
{
    [JsonConverter(typeof(MyConverter))]
    public object value { get; set; }
}
public class MyAttributes
{
    public string text { get; set; }
    public string color { get; set; }
}

public class MyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            return serializer.Deserialize<string>(reader);
        }
        else
        {
            return serializer.Deserialize<MyAttributes>(reader);
        }
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

DataContractJsonSerializer在这里是无用的…

我终于使用了Json.Net…

然后传递你的字符串到解析(确保它不是一个数组,而是一个包含你的数组的对象)…你可以看到我是如何用pubes作为我的回复的后缀和前缀的:

JObject jObject = JObject.Parse("{'"data'": " + response + "}");
JToken jData = jObject["data"];

然后你可以做任何你想做的:

string type = (string)jData["type"];

当然,这意味着我现在可以切换类型,然后创建一个所需类型的对象