使用WCF将JSON对象的一部分序列化和反序列化为字符串

时间:2015-06-04 20:30:41

标签: c# json wcf serialization

我有一个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时,我希望它能够正常往返。

1 个答案:

答案 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数组。

请注意,序列化期间不会保留字符串格式。