我使用api,它返回数据库查询的json格式化结果集。 我有一个等效的对象或结果的“模型”。 将json字符串转换为此对象列表的最佳方法是什么?
当然,关于这一点有很多线索,但没有人能够正确满足我的需求。
我发现的解决方案之一是:
var jobj = (JObject)JsonConvert.DeserializeObject(json);
var items = jobj.Children()
.Cast<JProperty>()
.Select(j => new
{
ID = j.Name,
Topic = (string)j.Value["Topic_ID"],
Moved = (string)j.Value["Moved_ID"],
Subject = (string)j.Value["subject"],
})
.ToList();
这似乎非常接近我的需要。我需要能够将键/值映射到已经存在的相应对象属性。那么也许你只需要改变一些东西来使它适用于我的对象?
PS:我正在使用Newtonsoft。任何.NET或Newtonsoft的解决方案,或者如果需要任何其他库都会很棒!答案 0 :(得分:0)
好的,所以你有这样的事情:
.Select(j => new **MyObject()**
{
ID = j.Name,
Topic = (string)j.Value["Topic_ID"],
Moved = (string)j.Value["Moved_ID"],
Subject = (string)j.Value["subject"]
})
并且您希望使用来自JSON的属性来实例化MyObjects数组吗?
在那种情况下,你只是一个回合 - 你当前正在创建一个与MyObject具有相同属性的动态对象,对吧?所以你需要做的就是创建一个实际的MyObject:
{{1}}
请注意,如果您的json属性名称与您的C#属性(包括大小写)完全匹配,则可以使用NewtonSoft执行此操作:http://www.newtonsoft.com/json/help/html/SerializingJSON.htm。但是要使用该方法,您必须有一个中间C#类来匹配您的JSON,然后自动(或手动转换)到MyObjects。或者您必须确保您的json和c#属性完全匹配。但是你已经非常接近(虽然有些人认为不那么优雅)解决方案。
答案 1 :(得分:0)
我最近一直在使用WebApi中的数据,并且我一直在使用以下代码将json对象转换为要使用的对象:
using (var client = new HttpClient())
{
var response = client.GetAsync(apiUri).Result;
// For single objects.
MyObject data = response.Content.ReadAsAsync<MyObject>().Result;
// For an array of objects
IEnumerable<MyObject> data = response.Content.ReadAsAsync<IEnumerable<MyObject>>().Result;
}
希望这有帮助。
答案 2 :(得分:0)
为什么不直接将json反序列化为对象类型?你可以这样做......
var obj = (YourType)JsonConvert.DeserializeObject(
json,
typeof(YourType),
new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
MissingMemberHandling=MissingMemberHandling.Ignore
});
或者我在问题中遗漏了什么?