user1868569
user1868569

Reputation: 23

Json get underlying array without retrieving its member

Im getting some json code from themoviedb.org

{
    "adult": false,
    "backdrop_path": "/8uO0gUM8aNqYLs1OsTBQiXu0fEv.jpg",
    "belongs_to_collection": null,
    "budget": 63000000,
    "genres": [
        {
            "id": 28,
            "name": "Action"
        },
        {
            "id": 18,
            "name": "Drama"
        },
        {
            "id": 53,
            "name": "Thriller"
        }
    ],
    "homepage": "",
    "id": 550,
    "imdb_id": "tt0137523",
    "original_title": "Fight Club",
    "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground \"fight clubs\" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion.",
    "popularity": 61151.745000000003,
    "poster_path": "/2lECpi35Hnbpa4y46JX0aY3AWTy.jpg",
    "production_companies": [
        {
            "name": "20th Century Fox",
            "id": 25
        }
    ],
    "production_countries": [
        {
            "iso_3166_1": "DE",
            "name": "Germany"
        },
        {
            "iso_3166_1": "US",
            "name": "United States of America"
        }
    ],
    "release_date": "1999-10-15",
    "revenue": 100853753,
    "runtime": 139,
    "spoken_languages": [
        {
            "iso_639_1": "en",
            "name": "English"
        }
    ],
    "status": "Released",
    "tagline": "How much can you know about yourself if you've never been in a fight?",
    "title": "Fight Club",
    "vote_average": 9.0999999999999996,
    "vote_count": 174
     "credits":{
      "cast": [
    {
      "id": 819,
      "name": "Edward Norton",
      "character": "The Narrator",
      "order": 0,
      "cast_id": 4,
      "profile_path": "/588Hrov6wwM9WcU88nJHlw2iufN.jpg"
    },
    {
      "id": 287,
      "name": "Brad Pitt",
      "character": "Tyler Durden",
      "order": 1,
      "cast_id": 5,
      "profile_path": "/kc3M04QQAuZ9woUvH3Ju5T7ZqG5.jpg"
    },
    {
      "id": 1283,
      "name": "Helena Bonham Carter",
      "character": "Marla Singer",
      "order": 2,
      "cast_id": 6,
      "profile_path": "/58oJPFG1wefMC0Vj7sFzHPrm67J.jpg"
    },
    {
      "id": 7470,
      "name": "Meat Loaf",
      "character": "Robert 'Bob' Paulson",
      "order": 3,
      "cast_id": 7,
      "profile_path": "/pwNyXgegO1nlZ8uWT847JM8EjGj.jpg"
    },
    {
      "id": 7471,
      "name": "Zach Grenier",
      "character": "Richard Chesler",
      "order": 4,
      "cast_id": 8,
      "profile_path": "/jghYiKdNkVehKpiVyE97AWrU9KQ.jpg"
    },
    {
      "id": 7472,
      "name": "Richmond Arquette",
      "character": "Intern",
      "order": 5,
      "cast_id": 9,
      "profile_path": null
    },
    {
      "id": 7219,
      "name": "David Andrews",
      "character": "Thomas",
      "order": 6,
      "cast_id": 10,
      "profile_path": "/pxmxn29UHW9r6uvLrd7bEwLswlQ.jpg"
    },
    {
      "id": 7473,
      "name": "Rachel Singer",
      "character": "Chloe",
      "order": 7,
      "cast_id": 11,
      "profile_path": null
    },
    {
      "id": 7497,
      "name": "Holt McCallany",
      "character": "The Mechanic",
      "order": 8,
      "cast_id": 22,
      "profile_path": "/hQBfcw9KVszdenlTZTR8AIrSpex.jpg"
    },
    {
      "id": 7498,
      "name": "Eion Bailey",
      "character": "Ricky",
      "order": 9,
      "cast_id": 23,
      "profile_path": "/4MnRgrwuiJvHsfoiJrIUL4TkfoC.jpg"
    },
    {
      "id": 7499,
      "name": "Jared Leto",
      "character": "Angel Face",
      "order": 10,
      "cast_id": 24,
      "profile_path": "/lzQSuu5o0JC9mCncYjVnncSH5lO.jpg"
    },
    {
      "id": 7500,
      "name": "Peter Iacangelo",
      "character": "Lou",
      "order": 11,
      "cast_id": 25,
      "profile_path": null
    },
    {
      "id": 56112,
      "name": "David Lee Smith",
      "character": "Walter",
      "order": 12,
      "cast_id": 30,
      "profile_path": "/xYkMA9AWtUN93KV5hWzlDkcnebB.jpg"
    }
  ],
  "crew": [
    {
      "id": 7469,
      "name": "Jim Uhls",
      "department": "Writing",
      "job": "Author",
      "profile_path": null
    },
    {
      "id": 7474,
      "name": "Ross Grayson Bell",
      "department": "Production",
      "job": "Producer",
      "profile_path": null
    },
    {
      "id": 7475,
      "name": "Ceán Chaffin",
      "department": "Production",
      "job": "Producer",
      "profile_path": null
    },
    {
      "id": 1254,
      "name": "Art Linson",
      "department": "Production",
      "job": "Producer",
      "profile_path": "/dEtVivCXxQBtIzmJcUNupT1AB4H.jpg"
    },
    {
      "id": 7477,
      "name": "John King",
      "department": "Sound",
      "job": "Original Music Composer",
      "profile_path": null
    },
    {
      "id": 7478,
      "name": "Michael Simpson",
      "department": "Sound",
      "job": "Original Music Composer",
      "profile_path": null
    },
    {
      "id": 7479,
      "name": "Jeff Cronenweth",
      "department": "Camera",
      "job": "Director of Photography",
      "profile_path": null
    },
    {
      "id": 7480,
      "name": "James Haygood",
      "department": "Editing",
      "job": "Editor",
      "profile_path": null
    },
    {
      "id": 7481,
      "name": "Laray Mayfield",
      "department": "Production",
      "job": "Casting",
      "profile_path": null
    },
    {
      "id": 1303,
      "name": "Alex McDowell",
      "department": "Art",
      "job": "Production Design",
      "profile_path": null
    },
    {
      "id": 7763,
      "name": "Ren Klyce",
      "department": "Sound",
      "job": "Sound Editor",
      "profile_path": null
    },
    {
      "id": 7764,
      "name": "Richard Hymns",
      "department": "Sound",
      "job": "Sound Editor",
      "profile_path": null
    },
    {
      "id": 7467,
      "name": "David Fincher",
      "department": "Directing",
      "job": "Director",
      "profile_path": "/dcBHejOsKvzVZVozWJAPzYthb8X.jpg"
    },
    {
      "id": 7468,
      "name": "Chuck Palahniuk",
      "department": "Writing",
      "job": "Novel",
      "profile_path": "/8nOJDJ6SqwV2h7PjdLBDTvIxXvx.jpg"
    }]

}
}

I already have a class that can store information about the cast, so don't want to make a whole class just to store the "Credits" property like i'm doing now. I want to get the underlying member cast and deserialize that to my list of cast members.

    [JsonProperty(PropertyName = "credits")]
    public Credits ActorsInMedia { get; set; }


    public class Credits
    {
        [JsonProperty(PropertyName = "cast")]
        public List<Actor> List { get; set; }
    }

I don't want the above with a whole new class, i want this without being in need of creating a new class. [JsonProperty(PropertyName = "cast")] public List List { get; set; }

I've already tried things like [JsonProperty(PropertyName = "credits.cast")] and [JsonProperty(PropertyName = "credits{cast}")]

Nothing works, how can i get the underlying cast item and retrieve that..

This is how i deseriallize

       Movie test = JsonConvert.DeserializeObject<Movie>(json);

Upvotes: 0

Views: 999

Answers (2)

Orel Eraki
Orel Eraki

Reputation: 12196

The following code should do the trick. For more information click Here

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JsonExp
{
    class Program
    {
        static void Main(string[] args)
        {

            string json = File.ReadAllText(@"D:\json\jsonResponse.txt");
            JObject jsonResults = JObject.Parse(json);

            // get JSON result objects into a list
            IList<JToken> results = jsonResults ["credits"]["cast"].Children().ToList();

            // serialize JSON results into .NET objects
            IList<Actor> searchResults = new List<Actor>();
            foreach (JToken result in results)
            {
                Actor searchResult = JsonConvert.DeserializeObject<Actor>(result.ToString());
              searchResults.Add(searchResult);
            }

            foreach (var actor in searchResults)
            {
                Console.WriteLine("{1}[{0}] as {2} Path: {3}", actor.Name, actor.Id, actor.Character, actor.ProfilePath);
            }

            Console.ReadKey();
        }
    }

    #region Json classes
    public class Credits
    {
        [JsonProperty(PropertyName = "cast")]
        public List<Actor> List { get; set; }
    }

    public class Actor
    {
        [JsonProperty(PropertyName = "id")]
        public int Id { get; set; }

        [JsonProperty(PropertyName = "name")]
        public string Name { get; set; }

        [JsonProperty(PropertyName = "character")]
        public string Character { get; set; }

        [JsonProperty(PropertyName = "order")]
        public string Order { get; set; }

        [JsonProperty(PropertyName = "cast_id")]
        public string CastId { get; set; }

        [JsonProperty(PropertyName = "profile_path")]
        public string ProfilePath { get; set; }
    }
    #endregion
}

Upvotes: 0

Mat J
Mat J

Reputation: 5632

You can manually retrieve the contents with something like

dynamic data = Newtonsoft.Json.Linq.JObject.Parse(content);
var value = data.credits.cast as Newtonsoft.Json.Linq.JArray; 
var actors = value.Select(x => x.ToObject<Actor>());

Upvotes: 0

Related Questions