当一个属性可以有不同的类型时,如何序列化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);
}
,但它崩溃的值。值位,因为它不能强制转换为强类型…
////编辑////
肯定有人以前这样做过!!
基本上你要把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"];
当然,这意味着我现在可以切换类型,然后创建一个所需类型的对象