在 C# 中将 json 字符串转换为现有对象列表



我使用一个 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
                   });

还是我在问题中遗漏了什么?

相关内容

  • 没有找到相关文章

最新更新