C# 如何将平面json对象转换为强类型对象的列表
我有一个Api,它返回一个类似这样的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],
{
"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;iJObject
将组转换为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();