我有一个WCF REST服务,它有一个包含几个类型字段的资源,然后是一个可以是一个对象数组的字段。我希望我们服务上的字段序列化这个字段,好像它是一个字符串。例如:
[DataContract]
public class User
{
[DataMember]
public long ID;
[DataMember]
public string Logon;
[DataMember]
public string Features;
}
当我们的API用户发布一个新的User对象时,我希望他们能够使用这样的东西作为正文:
{
"ID" : 123434,
"Logon" : "MyLogon",
"Features" : [
{ "type": "bigFeature", "size": 234, "display":true },
{ "type": "smFeature", "windowCount": 234, "enableTallness": true}
]
}
而不是
{
"ID" : 123434,
"Logon" : "MyLogon",
"Features" : "[
{ \"type\": \"bigFeature\", \"size\": 234, \"display\":true },
{ \"type\": \"smFeature\", \"windowCount\": 234, \"enableTallness\": true}
]"
}
在服务方面,我将把“Features”数组保存为数据库中的JSON文本博客,当我在GET调用上返回Object时,我希望它能够正常往返。
答案 0 :(得分:1)
如果您愿意切换到Json.NET,可以将Features
字符串序列化为私有JToken
代理属性:
[DataContract]
public class User
{
[DataMember]
public long ID;
[DataMember]
public string Logon;
string _features = null;
[IgnoreDataMember]
public string Features
{
get
{
return _features;
}
set
{
if (value == null)
_features = null;
else
{
JToken.Parse(value); // Throws an exception on invalid JSON.
_features = value;
}
}
}
[DataMember(Name="Features")]
JToken FeaturesJson
{
get
{
if (Features == null)
return null;
return JToken.Parse(Features);
}
set
{
if (value == null)
Features = null;
else
Features = value.ToString(Formatting.Indented); // Or Formatting.None, if you prefer.
}
}
}
请注意,为了在不转义的情况下序列化Features
字符串,必须是有效的JSON,否则您的外部JSON将会损坏。我在setter中强制执行此操作。如果您愿意,可以使用JArray
而不是JToken
强制要求字符串表示JSON数组。
请注意,序列化期间不会保留字符串格式。