【发布时间】:2014-06-11 19:55:40
【问题描述】:
我有一个DataMember,需要用 api json 字符串填写...
[DataContract]
public class Values
{
[DataMember]
public object value { get; set; }
}
API json 字符串:
[
{
"type": "text",
"values": [
{
"value": "Text that is in textfield"
}
]
},
{
"type": "category",
"values": [
{
"value": {
"text": "Category title",
"color": "#000000"
}
}
]
}
]
我将此字符串映射到强类型对象Field,如下所示:
private List<Field> PrepFieldObject(string response)
{
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Field>));
return (List<Field>)serializer.ReadObject(stream);
}
}
但是当它映射到Values.value 时,它会发出嘶嘶声……我试着这样解决它:
[DataContract]
public class Values
{
[DataMember]
public object value
{
get {
return xamlValue;
}
set
{
xamlValue = new Value();
if( value is string )
{
xamlValue.text = (string)value; // This works fine
}
else
{
Value theValue = value as Value;
try
{
xamlValue.text = theValue.text; // Can't get hold of .text even though it does exist in the json.
xamlValue.color = theValue.color;
}
catch (Exception e)
{
}
}
}
}
public Value xamlValue { get; set; }
}
[DataContract]
public class Value
{
[DataMember]
public string text { get; set; }
[DataMember]
public string color { get; set; }
}
但它不允许我访问对象的属性(我猜是因为它们从未被 DataContract 映射)
我试过添加
[KnownType(typeof(Value))]
[KnownType(typeof(string))]
但这也无济于事:'(
【问题讨论】:
-
您应该避免将自己置于您不知道对象是字符串还是具有您需要获取的某些字符串属性的复杂对象的情况。解决方案将取决于未显示的上下文,但也许您应该先将字符串值从复杂对象中提取出来,然后再将其存储到您的
value属性中。 -
在这种情况下,您认为您可以帮我使用 getter 和 setter 吗?如果设置的值不是字符串类型,那么使用对象来代替?如果你找不到时间,我会努力的。不过谢谢。
-
您不应该首先尝试设置复杂类型。无论您调用此设置器并分配复杂类型的任何代码都应更改为分配该复杂类型的字符串值。在不知道该代码是什么的情况下,我无法说出确切需要更改的内容。
-
是一个返回json字符串的api。我在 newtonsoft json 旁边使用一个流来映射到强类型类。不幸的是,在这个特定的 [DataMember] 上,它的映射方式不同,所以我需要一种巧妙的方法将它映射到 strong,这取决于它是什么,或者只是作为动态的(但这似乎不适用于 xaml)跨度>
-
对不起,我是说 DataContractJsonSerializer
标签: c# xaml datamember