简体   繁体   中英

Converting json string into list of existing object in C#

I work with an api, that returns a json formatted resultset of a database query. I have an equivalent object or "model" for the results. What is the best way to convert the json string into a list of this object?

Of course there are many threads about this, but no one fits my needs properly.

One of the solutions I've found was this:

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();

This seems pretty close to what I need. I need to be able to map the keys/values to the appropriate object attributes, which DOES already exist. So maybe you only need to change a few things to make it work for my object?

PS: I'm using Newtonsoft. Any solution for .NET or Newtonsoft or if needed any other library would be great!

OK, so you have something like this:

public class MyObject
{
   public int ID {get; set;}
   public string Topic {get; set;}
   public string Subject {get; set;}
}

And you want to instantiate an array of MyObjects with the properties coming from your JSON?

In that case you're just a bout there - you're currently creating a dynamic object with the same properties as MyObject, right? So all you need to do is create an actual MyObject instead:

.Select(j => new **MyObject()**
{
    ID = j.Name,
    Topic = (string)j.Value["Topic_ID"],
    Moved = (string)j.Value["Moved_ID"],
    Subject = (string)j.Value["subject"]
})

Note that if your json property names exactly match your C# ones (including case), you can do this as a one-liner with NewtonSoft: http://www.newtonsoft.com/json/help/html/SerializingJSON.htm . But to use that method you'd have to have an intermediate C# class to match your JSON, and then automap (or manually convert) those to MyObjects. Or you'd have to make sure your json and c# properties match exactly. But you're already very close to a quicker (though some would argue less elegant) solution.

I have recently been consuming data from a WebApi and i have been using the following code to convert the json object to an object to work with:

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;
}

Hope this helps.

Why aren't you deserializing the json into the object type directly? you can do it like this...

var obj = (YourType)JsonConvert.DeserializeObject(
                   json,
                   typeof(YourType),
                   new JsonSerializerSettings()
                   {
                       TypeNameHandling = TypeNameHandling.Auto,
                       MissingMemberHandling=MissingMemberHandling.Ignore
                   });

or am I missing something in the question?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM