当目标包含 JArray 属性时无论如何要使用 Automapper?

问题描述 投票:0回答:1

假设我有一个源 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

c# json asp.net-core automapper
1个回答
0
投票

在这种情况下你不需要任何映射器

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"
      }
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.