英文:
Deserialize by automatically splitting for each element of a sublist in C#
问题
以下是您要求的翻译:
有可能已经存在解决这个问题的答案,但我不太知道如何解释我的问题,所以我会在这里尝试一下。
假设我从一个 JSON 格式的 API 中获取数据。假设它的格式如下:
{
"name": "Animals",
"className": "Mammals",
"speciesList": [
{
"species": "Panthera leo",
"subspecies": "leo"
},
{
"species": "Equus quagga",
"subspecies": "quagga"
}
]
}
我想将它们存储在以下类中:
public class Animal
{
public string name {get; set;}
public string className {get; set;}
public string species {get; set;}
public string subspecies {get; set;}
}
如何使用这个类进行反序列化,以便创建两个对象,如下所示:
Animal("Animals", "Mammals", "Panthera leo", "leo")
Animal("Animals", "Mammals", "Equus quagga", "quagga")
我知道我可以提取所有数据,但想知道是否有一种直接的方法来实现这个!提前谢谢!
英文:
It is possible that an answer to this exist but I don't really know how to explain my problem so I'll do it here.
Let's imagine I am grabbing datas from an api in a JSON format. Let's say it has the following format :
{
"name": "Animals",
"className": "Mammals",
"speciesList": [
{
"species": "Panthera leo",
"subspecies": "leo"
},
{
"species": "Equus quagga",
"subspecies": "quagga"
}
]
}
And I want to store them in the following class :
public class Animal
{
public string name {get; set;}
public string className {get; set;}
public string species {get; set;}
public string subspecies {get; set;}
}
How can I deserialize it with a class so that it creates me 2 objects, as follows :
Animal("Animals", "Mammals", "Panthera leo", "leo")
Animal("Animals", "Mammals", "Equus quagga", "quagga")
I know that I can extract all but wanted to know if there was a direct way to create this !
Thanks in advance !
答案1
得分: 1
使用 Newtonsoft.Json 库,首先你要将 JSON 提取为 JObject
。然后将 speciesList
数组提取为 JArray
,这样你可以迭代每个元素并转换为 List<Animal>
。
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
JObject jObj = JObject.Parse(json);
List<Animal> animals = (jObj.SelectToken("speciesList") as JArray)
.Select(x => new Animal
{
Name = jObj.Value<string>("name"),
ClassName = jObj.Value<string>("className"),
Species = x.Value<string>("species"),
Subspecies = x.Value<string>("subspecies")
})
.ToList();
与此同时,建议使用 Pascal 命名法为属性命名。
public class Animal
{
public string Name {get; set;}
public string ClassName {get; set;}
public string Species {get; set;}
public string Subspecies {get; set;}
}
英文:
With Newtonsoft.Json library, first you extract the JSON as JObject
. And extract the speciesList
array as JArray
, so you can iterate each element and convert into List<Animal>
.
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
JObject jObj = JObject.Parse(json);
List<Animal> animals = (jObj.SelectToken("speciesList") as JArray)
.Select(x => new Animal
{
Name = jObj.Value<string>("name"),
ClassName = jObj.Value<string>("className"),
Species = x.Value<string>("species"),
Subspecies = x.Value<string>("subspecies")
})
.ToList();
Meanwhile, would suggest that to use Pascal case for the property name.
public class Animal
{
public string Name {get; set;}
public string ClassName {get; set;}
public string Species {get; set;}
public string Subspecies {get; set;}
}
答案2
得分: 1
由于您想将所有代码放在一个类中,您可以考虑这样做:
List<Animal> animals = JsonConvert.DeserializeObject<Animals>(json).SpeciesList;
public class Animals
{
public List<Animal> SpeciesList { get; init; }
public Animals(string name, string className, List<Animal> speciesList)
{
speciesList.ForEach(x =>
{
x.name = name;
x.className = className;
});
SpeciesList = speciesList;
}
}
英文:
since you want to place all code inside of one class, you can consider this
List<Animal> animals = JsonConvert.DeserializeObject<Animals>(json).SpeciesList;
public class Animals
{
public List<Animal> SpeciesList { get; init; }
public Animals(string name, string className, List<Animal> speciesList)
{
speciesList.ForEach(x =>
{
x.name = name;
x.className = className;
});
SpeciesList = speciesList;
}
}
</details>
# 答案3
**得分**: 0
你也可以使用 `JsonConvert.DeserializeObject` 将 `JSON` 数据转换为一个 `dynamic` 对象
```csharp
public class Animal
{
public string name {get; set;}
public string className {get; set;}
public string species {get; set;}
public string subspecies {get; set;}
}
// 将 JSON 数据反序列化为 Animal 对象列表
string json = "{\"name\": \"Animals\", \"className\": \"Mammals\", \"speciesList\": [{\"species\": \"Panthera leo\",\"subspecies\": \"leo\"},{\"species\": \"Equus quagga\",\"subspecies\": \"quagga\"}]}";
var data = JsonConvert.DeserializeObject<dynamic>(json);
List<Animal> animals = new List<Animal>();
foreach (var species in data.speciesList)
{
Animal animal = new Animal
{
name = data.name,
className = data.className,
species = species.species,
subspecies = species.subspecies
};
animals.Add(animal);
}
```
<details>
<summary>英文:</summary>
You can also use `JsonConvert.DeserializeObject` to convert the `JSON` data into a `dynamic` object
public class Animal
{
public string name {get; set;}
public string className {get; set;}
public string species {get; set;}
public string subspecies {get; set;}
}
// Deserialize the JSON data into a list of Animal objects
string json = "{ \"name\": \"Animals\", \"className\": \"Mammals\", \"speciesList\": [{\"species\": \"Panthera leo\",\"subspecies\": \"leo\"},{\"species\": \"Equus quagga\",\"subspecies\": \"quagga\"}]}";
var data = JsonConvert.DeserializeObject<dynamic>(json);
List<Animal> animals = new List<Animal>();
foreach (var species in data.speciesList)
{
Animal animal = new Animal
{
name = data.name,
className = data.className,
species = species.species,
subspecies = species.subspecies
};
animals.Add(animal);
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论