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

本文关键字:序列化 反序列化 字符串 一部分 WCF JSON 对象 使用 | 更新日期: 2023-09-27 17:53:21

我有一个WCF REST服务,它有一个包含几个类型字段的资源,然后是一个可以是对象数组的字段。我希望服务上的字段将这个字段当作字符串来序列化。例子:

[DataContract]
public class User
{
   [DataMember]
   public long ID;
   [DataMember]
   public string Logon;
   [DataMember]
   public string Features; 
}

当API的用户POST一个新的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调用上返回对象时,我希望它能够正确往返。

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

如果您愿意切换到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数组。

请注意,在序列化过程中不会保留字符串格式。