1

我可以动态关闭和打开数据合同属性吗?本质上,我想要两个数据合约,一个在第 3 方和我的应用程序之间,一个在我的应用程序和我的客户之间——无需管理两个 DTO 类。例如,考虑 MyDTO:

[DataContract]
public class MyDTO
{
    [DataMember(Name = "Lame/3rdParty/Inbound/Key")]
    public string MyCoolOutboundKey { get; set; }
}

我想用 ServiceStack.Text 反序列化 DTO:

MyDTO dto = "{\"Lame/3rdParty/Inbound/Key\":\"CoolValue\"}".FromJson<MyDTO>();

但是,我想对其进行序列化,以便此断言为真:

Assert.AreEqual("{\"MyCoolOutboundKey\":\"CoolValue\"}",dto.ToJson());

有问题的实际对象有超过一百个属性,所以我希望避免为了允许出站序列化而创建第二个类。

4

2 回答 2

2

所以,你的方法没有错,但我认为你低估了 的力量JsonObject,它有点像 LINQ to JSON。

我用它从谷歌地图获取地理数据并将其映射到一个不错的小 DTO:

var jsonObj = jsonFromGoogleMaps.FromJson<JsonObject>();

return (
    from x in jsonObject.Get<JsonArrayObjects>("results")
    let geo = x.Get("geometry")
    let loc = geo.Get("location")
    return new Coords
    {
        Lat = x.Get<decimal>("lat"),
        Lng = x.Get<decimal>("lng"),
    }
).FirstOrDefault();
于 2013-05-10T15:42:23.867 回答
1

好的 - 很明显,您不能在运行时更改属性

另一种可以围绕整个问题创建最终运行的替代方法是预处理传入的 json,根据映射替换键,即:

Dictionary<String,String> map = new Dictionary<String,String>();
map.Add("Lame/3rdParty/Inbound/Key","MyCoolOutboundKey");

JsonObject result = new JsonObject();
JsonObject obj = jsonObject.Parse("{\"Lame/3rdParty/Inbound/Key\":\"CoolValue\"}");

foreach (var entry in obj)
{
    entry.Key = map[entry.Key];
    result[entry.Key] = entry.Value;
}

Assert.AreEqual("{\"MyCoolOutboundKey\":\"CoolValue\"}",result.ToJson());

这样,我需要的唯一数据合同将是我的应用程序和我的应用程序客户端之间的数据合同。

于 2013-05-09T20:57:13.373 回答