【问题标题】:Deserialize a JSON with nested arrays to generate a string from values使用嵌套数组反序列化 JSON 以从值生成字符串
【发布时间】:2015-12-25 14:00:09
【问题描述】:

在我的应用程序中,我有一个List<Users>

[{
"Id": "1",
"Name": "last, first",
"Skills": [{"SN":"20","SL":"12"},{"SN":"197","SL":"09"}]
},
{
"Id": "2",
"Name": "Black, Jack",
"Skills": [{"SN":"40","SL":"07"},{"SN":"199","SL":"05"}]
},
{
"Id": "3",
"Name": "Rooney, Wayne",
"Skills": [{"SN":"40","SL":"11"},{"SN":"201","SL":"07"}]
}]

我需要将这些数据转换成一个字符串,格式如下:

“1/last, first/20-12,197-09;2/Black, Jack/40-07,199-05;3/Rooney, 韦恩/40-11,201-07"

我试图序列化这个对象以获得一个 JSON 字符串:

public IHttpActionResult ImportUsers([FromBody]IEnumerable<Users> newUsers)
{
    string agents = JsonConvert.SerializeObject(newUsers);
    return Ok(agents);
}

并得到一个结果:

"[{\"Id\":\"1\",\"姓名\":\"last, 第一\",\"技能\":[{\"SN\":\"20\",\"SL\":\"12\"},{\"SN\":\"197\", \"SL\":\"09\"}]},{\"Id\":\"2\",\"Name\":\"Black, 杰克\",\"技能\":[{\"SN\":\"40\",\"SL\":\"07\"},{\"SN\":\"199\", \"SL\":\"05\"}]},{\"Id\":\"3\",\"姓名\":\"鲁尼, 韦恩\",\"技能\":[{\"SN\":\"40\",\"SL\":\"11\"},{\"SN\":\"201\", \"SL\":\"07\"}]}]"

比我尝试反序列化这个字符串来获取每个变量的值

var dict = JsonConvert.DeserializeObject<dynamic>(agents);
            List<string> results = new List<string>();
            foreach (var d in dict)
            {                
                var skills = d["Skills"];                
                string skill = string.Join(",", skills);
                string list = d["Id"] + "/" + d["Name"] + "/" + skill;
                results.Add(list);
            }
            string result = string.Join(";", results);

并得到这个字符串:

"1/last, first/{\r\n \"SN\": \"20\",\r\n \"SL\": \"12\"\r\n},{\ r\n \"SN\": \"197\",\r\n \"SL\": \"09\"\r\n};2/布莱克, 杰克/{\r\n \"SN\": \"40\",\r\n \"SL\": \"07\"\r\n},{\r\n \"SN\": \"199\",\r\n \" SL\": \"05\"\r\n};3/鲁尼,韦恩/{\r\n \"SN\": \"40\",\r\n \"SL\": \"11\"\r\n},{\r\n \"SN\": \"201\",\r\n \"SL\": \"07\"\r\n}"

所以它更像我需要的,但我仍然对技能列表中的值有疑问。如何像使用 Id 和 Name 列一样从中获取值?也许我需要再次反序列化这部分或使用一些正则表达式来实现我需要的字符串?

【问题讨论】:

    标签: c# json regex


    【解决方案1】:

    您的预期结果不是有效的 json。那么更好的方法是通过 c# 格式化结果字符串而不使用 3rd 方库。

    简洁的方式是使用字符串函数:

    public IHttpActionResult ImportUsers([FromBody] IEnumerable<User> newUsers)
    {
        var agents = string.Join(";", newUsers.Select(GetFormattedUserString));
        return Ok(agents);
    }
    
    private string GetFormattedUserString(User user)
    {
        return string.Concat(user.Id, "/", user.Name, "/", string.Join(",", user.Skills.Select(skill => string.Concat(skill.SN, "-", skill.SL))));
    }
    

    有效且不易理解(我认为)的方法是使用StringBuilder

    public IHttpActionResult ImportUsers([FromBody] IEnumerable<User> newUsers)
    {
        var sb = new StringBuilder();
    
        foreach (var user in newUsers)
        {
            sb.Append(user.Id);
            sb.Append("/");
    
            sb.Append(user.Name);
            sb.Append("/");
    
            for (int i = 0; i < user.Skills.Length; i++)
            {
                sb.Append(user.Skills[i].SN);
                sb.Append("-");
                sb.Append(user.Skills[i].SL);
                if (i != user.Skills.Length)
                    sb.Append(",");
            }
    
            sb.Append(";");
        }
    
        var result = sb.ToString();
        return Ok(result);
    }
    

    【讨论】:

    • 简直太棒了!他们俩的工作都很棒。谢谢)
    【解决方案2】:

    您可以稍微修改您的代码以使其正常工作。为了以您想要的方式获得技能,您可以嵌套另一个 foreach 循环,它将以请求的格式创建技能列表:

    var dict = JsonConvert.DeserializeObject<dynamic>(agents);
    List<string> results = new List<string>();
    foreach (var d in dict)
    {
        List<string> skills = new List<string>();
    
        foreach (var s in d["Skills"])
        {
            skills.Add(s["SN"].ToString() + "-" + s["SL"].ToString());
        }
    
        string skill = string.Join(",", skills);
        string list = d["Id"] + "/" + d["Name"] + "/" + skill;
        results.Add(list);
    }
    string result = string.Join(";", results);
    

    【讨论】:

    • 谢谢,伙计。对我真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2012-01-12
    • 2022-09-23
    • 1970-01-01
    • 2019-09-22
    • 2017-12-07
    相关资源
    最近更新 更多