首页 > 解决方案 > 如何在 foreach 循环中将 JsonConvert jsonString 映射到 jsonObject?

问题描述

如何JsonConvert通过我使用 Newtonsoft.Json 并使用循环 foreach 数据将 jsonString 转换为 jsonObject 来映射数据,我想从 jsonObject all 中获取类似于以下结果的数据。感谢您的帮助。

我的参数:

public class FundInPortRes
{
    public string fcode { get; set; }
    public string abbreviation { get; set; }
    public string chnfname { get; set; }
    public string AMC { get; set; }
    public string chnmain_scope { get; set; }
    public string risklevel { get; set; }
    public List<FundInPortNAVRes> NAV { get; set; }
}

public class FundInPortNAVRes
{
    public string fcode { get; set; }
    public string navdate { get; set; }
    public string nav { get; set; }
    public double navDiff { get; set; }
}

我的代码:

Array Data F.NAV = [{"fcode":"004123"}, {"nav":"12.83210"}, {"navdate":"20190305"}, {"navDiff":"-0.0351"}]

    [HttpPost]
    public List<Models.FundInPortRes> GetFund2InPort(Models.FundInPortReq model)
    {
        DataAccess.DashDAL dal = new DataAccess.DashDAL();
        List<Models.FundAllRes> models = dal.GetFund2InPort(model);
        List<Models.FundInPortRes> result = new List<Models.FundInPortRes>();

        if (models.Count > 0)
        {
            foreach (var F in models)
            {
                 Models.FundInPortRes resData = new Models.FundInPortRes();
                 resData.fcode = F.fcode;
                 resData.abbreviation = F.abbreviation;
                 resData.chnfname = F.chnfname;
                 resData.AMC = F.AMC;
                 resData.chnmain_scope = F.chnmain_scope;
                 resData.risklevel = F.risklevel;
                 resData.NAV = JsonConvert.DeserializeObject<List<Models.FundInPortNAVRes>>(F.NAV);
                 result.Add(resData);
           }
       }

       return result;
    }

我的结果:

[{
    "fcode": "004009",
    "abbreviation": "FLEX-RMF",
    "AMC": "ONEONLINE",
    "chnmain_scope": "Fund All",
    "risklevel": "5",
    "NAV": [{
            "fcode": "004009",
            "navdate": null,
            "nav": null,
            "navDiff": 0.0
        },
        {
            "fcode": null,
            "navdate": null,
            "nav": "27.14270",
            "navDiff": 0.0
        },
        {
            "fcode": null,
            "navdate": "20190306",
            "nav": null,
            "navDiff": 0.0
        },
        {
            "fcode": null,
            "navdate": null,
            "nav": null,
            "navDiff": -0.1715
        }
    ]
}]

我想要的结果:

[{
    "fcode": "004009",
    "abbreviation": "FLEX-RMF",
    "AMC": "ONEONLINE",
    "chnmain_scope": "Fund All",
    "risklevel": "5",
    "NAV": [{
            "fcode": "004009",
            "navdate": "20190306",
            "nav": "27.14270",
            "navDiff": -0.1715
        }
    ]
}]

标签: c#jsonjsonconvert

解决方案


只需使用 Newtonsoft 的 JsonProperty。这是一个示例代码。

using Newtonsoft.Json;    
// ...
public class FundInPortRes
{
    [JsonProperty("NameOfThePropertyToMap")]
    public string fcode { get; set; }
    // Other properties
}

更新

在您的情况下,结果是正确的。您所做的只是创建一个“FundInPortNAVRes”列表,每个字段的值分配给不同的对象。您需要做的只是将所有字段的值组合到一个对象中。这是一个简单的方法:

// Here every field are assigned to different object instead of one.
var json  = "[{ \"fcode\":\"004123\"},{ \"nav\":\"12.83210\"},{ \"navdate\":\"20190305\"},{ \"nav2\":\"12.8672\"},{ \"navDate2\":\"20190306\"},{ \"navDiff\":\"-0.0351\"}]";
// so we change the json so that the field will be for a single object.
var actualRequiredJson = json.Replace("},{", ",");
// For multiple items but in a specific sequence
var multipleItemsJson = actualRequiredJson.Replace(",\"fcode\":","},{\"fcode\":");

var response = JsonConvert.DeserializeObject<List<FundInPortNAVRes>>(actualRequiredJson);

推荐阅读