Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将平面json对象转换为强类型对象的列表_C#_Json - Fatal编程技术网

C# 如何将平面json对象转换为强类型对象的列表

C# 如何将平面json对象转换为强类型对象的列表,c#,json,C#,Json,我有一个Api,它返回一个类似这样的json对象,我对此没有任何控制权: { "name[0]":"cat", "map[0]":"catmap", "name[1]":"dog", "map[1]":"dogmap", "name[2]":"lion", "map[2]":"lionmap", "name[3]":"tiger", "map[3]":"tigermap", "name[4]":"snake", "map[4]":"snakemap" } (名称[i],

我有一个Api,它返回一个类似这样的json对象,我对此没有任何控制权:

{  
 "name[0]":"cat",
 "map[0]":"catmap",
 "name[1]":"dog",
 "map[1]":"dogmap",
 "name[2]":"lion",
 "map[2]":"lionmap",
 "name[3]":"tiger",
 "map[3]":"tigermap",
 "name[4]":"snake",
 "map[4]":"snakemap"
}
(名称[i],映射[i])对的数量不受限制

我需要将它转换为一个强对象列表:list


我怎么能?有什么想法吗?

不是最好的解决方案,但很有效:

        var list = new List<Animal>();
        var r = JsonConvert.DeserializeObject<Dictionary<string, string>>(data).Values.ToArray();
        for (int i = 0; i < r.Length; i+=2)
        {
            list.Add(new Animal()
            {
                Name = r[i],
                Map = r[i+1]
            });
        }
var list=newlist();
var r=JsonConvert.DeserializeObject(data.Values.ToArray();
对于(int i=0;i
敢于提供正则表达式解决方案:

var animals = new List<Animal>();
var matches = Regex.Matches(json, @"(?s)""name\[\d+]"":.+?""map\[\d+]"":.+?(?=,|\r\n|})");
foreach (Match match in matches)
{
    var json_obj = $"{{{Regex.Replace(match.Value, @"\[\d+]", "")}}}";
    var animal = Newtonsoft.Json.JsonConvert.DeserializeObject<Animal>(json_obj) as Animal;
    animals.Add(animal);
}
var动物=新列表();
var matches=Regex.matches(json,@“(?s)”“name\[\d+]”:.+?“map\[\d+]”:.+?(?=,|\r\n |})”;
foreach(匹配中的匹配)
{
var json_obj=$“{{{Regex.Replace(match.Value,@”\[\d+],“)}”;
var animal=Newtonsoft.Json.JsonConvert.DeserializeObject(Json_obj)作为动物;
动物。添加(动物);
}

同样,这不是最好的解决方案,但可以提供所需的结果:

var json = "{  \r\n \"name[0]\":\"cat\",\r\n \"map[0]\":\"catmap\",\r\n \"name[1]\":\"dog\",\r\n \"map[1]\":\"dogmap\",\r\n \"name[2]\":\"lion\",\r\n \"map[2]\":\"lionmap\",\r\n \"name[3]\":\"tiger\",\r\n \"map[3]\":\"tigermap\",\r\n \"name[4]\":\"snake\",\r\n \"map[4]\":\"snakemap\"\r\n}";

var jObject = JObject.Parse(json);

var list = new List<Animal>();

for (int i = 0; i < jObject.Count / 2; i++)
{
    list.Add(new Animal
    {
        Name = jObject.GetValue($"name[{i}]").ToString(),
        Map = jObject.GetValue($"map[{i}]").ToString()
    });
}
目前,该地区的地图[0],\r\n\n”地图[0]目前,”,”,”catmap,”,”,”,”,”r\n\n\r\n\n\r\n\n”名[1”名[1],,\r\n\n\n\n\n\r\n\n\r\n\n\n\n\r\n\n\n\n\n\n缔约缔约缔约缔约缔约方的JSJSJSJSJS公司的JS公司的一名名[1,”,”,”,”2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007-cat地图[0-猫地图[0,”,”,”,”,”,”,”,”,”,”,”猫地图[0地图[0.cat地图,”猫地图,”猫地图,”猫地图,”,”,”猫地图,”猫地图,”,”,”猫地图,”,”,”,”,”猫地图,”,”,”,”,”,”,”猫地图,”猫图,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”地图,”猫地图,,\r\r\地图[4]\“:\“蛇形地图\”\r\n}”; var jObject=jObject.Parse(json); var list=新列表(); 对于(int i=0;i下面是一个使用Json.Net API的简洁解决方案

它的工作原理是按索引将属性分组,然后通过临时的
JObject
将组转换为
Animal
对象

var animals = (from p in JObject.Parse(json).Properties()
               let parts = p.Name.Split(new char[] { '[', ']' })
               group new JProperty(parts[0], p.Value) by int.Parse(parts[1]) into g
               orderby g.Key
               select new JObject(g).ToObject<Animal>())
               .ToList();
var animals=(来自JObject.Parse(json.Properties()中的p)
让parts=p.Name.Split(新字符[]{'[',']})
通过int.Parse(parts[1])将新的JProperty(parts[0],p.Value)分组到g中
orderby g.Key

选择new JObject(g).ToObject

你自己说的。在那里有一个带有列表的类。每次获取这个对象,循环遍历它并给列表赋值。熟悉Json.NET库。使用它,你可以将Json文件作为
JObject
(Json.NET库中的一种类型)加载,然后您可以查询它的属性和相应的属性值。如果您愿意,甚至可以将Linq与之一起使用。(StackOverflow上的Json.NET文档以及关于Json.NET/JObject的许多问答可以告诉您关于它的更多细节)@elgonzo在这里,我们问问题是为了得到详细的答案,不仅仅是图书馆的链接,不如开始回答,我会检查你是否试图告诉我你拒绝投入研究,并且由于你不愿意做研究,我应该为你做这件事?如果不是,你到底想用你的评论告诉我什么?@elgonzo在过去,它已经为他们工作了数百次,包括这次。如果他们已经清楚地知道不需要编程,为什么还要花时间来学习如何编程?请注意,字典不能保证键/值的特定顺序。任何感知到的顺序都只是巧合,并且可能不会观察到相同的行为当在不同的.NET运行时/平台上运行代码时。因此,依赖Dictionary.Values集合的特定顺序是非常危险的。这是一个非常好的解决方案!
var animals = (from p in JObject.Parse(json).Properties()
               let parts = p.Name.Split(new char[] { '[', ']' })
               group new JProperty(parts[0], p.Value) by int.Parse(parts[1]) into g
               orderby g.Key
               select new JObject(g).ToObject<Animal>())
               .ToList();