假设我有一个源 JObject:
var source = new JObject
{
{ "XCV", Guit.NewGuid().ToString() },
{ "store", "abc" },
{ "productAId", "123" },
{ "productAName", "xxxxxx" },
{ "productBId", "456" },
{ "productBName", "yyyyyy" },
};
和定制模型:
public class StoreProductModel
{
public string TransactionId { get; set; }
public JArray Data { get; set; }
}
如果我将 StoreProductModel 转换为 json,我期望的结构如下:
{
"transactionId": "...",
"data": [
{
"store": "abc",
"productA": {
"id": "123",
"name": "xxxxxx",
},
"productB": {
"id": "456",
"name": "yyyyyy"
}
}
]
}
我尝试的尽可能简单:
#region JValue - object
CreateMap<JValue, object>().ConvertUsing(source => source.Value);
#endregion
#region JObject - StoreProductModel
CreateMap<JObject, StoreProductModel>()
.ForMember(dest => dest.TransactionId, opt => { opt.MapFrom(src => src["XCV"]); })
.ForPath(dest => dest.Data[0]["productA"]["id"], opt => { opt.MapFrom(src => src["productAId"]); })
.ForPath(dest => dest.Data[0]["productA"]["name"], opt => { opt.MapFrom(src => src["productAName"]); });
#endregion
我得到的异常:
“只允许成员访问。dest => dest.Data.get_Item(0).get_Item("productA").get_Item("id") (Parameter 'destinationMember')"} System.ArgumentOutOfRangeException
我确实有一个选项可以直接初始化 StoreProductModel 并分配值,但是如果可以实现从 JObject 源映射到 JArray 中具有嵌套属性的自定义模型的目标,我会寻求一些建议。
Automapper 版本:12.0.1
在这种情况下你不需要任何映射器
var s = ...your source JObject
StoreProductModel storeProductModel = new StoreProductModel
{
TransactionId = (string)s["XCV"],
Data = new JArray{ new JObject {
{"store", s["store"] },
{"productA", new JObject { {"productId", s["productAId"] },
{"productName", s["productAName"] }}
},
{"productB", new JObject { {"productId", s["productBId"] },
{"productName", s["productBName"] }} }
}}
};
输出
JsonConvert.SerializeObject(storeProductModel, Newtonsoft.Json.Formatting.Indented);
{
"TransactionId": "d1f88a3c-32c6-4a13-931b-3f819372b850",
"Data": [
{
"store": "abc",
"productA": {
"productId": "123",
"productName": "xxxxxx"
},
"productB": {
"productId": "456",
"productName": "yyyyyy"
}
}
]
}