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

时间:2017-01-02 16:09:37

标签: c# json json.net

我使用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的解决方案,或者如果需要任何其他库都会很棒!

3 个答案:

答案 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
                   });

或者我在问题中遗漏了什么?