我使用一个 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的解决方案,或者如果需要,任何其他库都会很棒!
我最近一直在使用来自 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;
}
希望这有帮助。
好的,所以你有这样的东西:
public class MyObject
{
public int ID {get; set;}
public string Topic {get; set;}
public string Subject {get; set;}
}
你想使用来自你的 JSON 的属性实例化一个 MyObjects 数组吗?
在这种情况下,你只是一个回合 - 你目前正在创建一个与MyObject具有相同属性的动态对象,对吧? 因此,您需要做的就是创建一个实际的MyObject:
.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 属性名称与您的 C# 属性名称(包括大小写)完全匹配,则可以使用 NewtonSoft: http://www.newtonsoft.com/json/help/html/SerializingJSON.htm 作为单行代码执行此操作。 但是要使用该方法,您必须有一个中间 C# 类来匹配您的 JSON,然后将其自动映射(或手动转换)到 MyObjects。 或者,必须确保 json 和 c# 属性完全匹配。 但是你已经非常接近一个更快(尽管有些人会认为不那么优雅)的解决方案。
为什么不直接将 json 反序列化为对象类型? 你可以这样做...
var obj = (YourType)JsonConvert.DeserializeObject(
json,
typeof(YourType),
new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
MissingMemberHandling=MissingMemberHandling.Ignore
});
还是我在问题中遗漏了什么?