https://stackoverflow.com/questions/56173539/populate-multiple-objects-from-json/56176705#56176705

CSharp · Console

/Program.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters;
using System.IO;
using System.Data;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Reflection;
using System.Data.OleDb;
using System.Data;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;	

using NUnit.Framework; // Throws NUnit.Framework.AssertionException

    public class Customer
    {
        public Int32 id { get; set; }
        public User user1 { get; set; }
        public User user2 { get; set; }
    }

    public class User
    {
        public Int32 Id { get; set; }
        public string Name { get; set; }
    }

    public static class DataReaderExtensions
    {
        // Adapted from this answer https://stackoverflow.com/a/1202973
        // To https://stackoverflow.com/questions/1202935/convert-rows-from-a-data-reader-into-typed-results
        // By https://stackoverflow.com/users/3043/joel-coehoorn
        public static IEnumerable<T> SelectRows<T>(this IDataReader reader, Func<IDataRecord, T> select)
        {
            while (reader.Read())
            {
                yield return select(reader);
            }
        }
    }

    class TestClass
    {
        public static void Test()
        {
            // Create a mockup data reader.
            using (IDataReader x = GetDataTable().CreateDataReader())
            {
                var lista = x
                    .SelectRows(r =>
                        // Extract the row data by name into a flat object
                        new
                        {
                            id = Convert.ToInt32(r["id"], NumberFormatInfo.InvariantInfo),
                            id_user = Convert.ToInt32(r["id_user"], NumberFormatInfo.InvariantInfo),
                            name = r["name"].ToString(),
                            id_user1 = Convert.ToInt32(r["id_user1"], NumberFormatInfo.InvariantInfo),
                            name1 = r["name1"].ToString(),
                        })
                    .Select(r =>
                        // Convert the flat object to a `Customer`.
                        new Customer
                        {
                            id = r.id,
                            user1 = new User { Id = r.id_user, Name = r.name },
                            user2 = new User { Id = r.id_user1, Name = r.name1 },
                        })
                        .ToList();

				// Assert we got the required results.
				Assert.IsTrue(lista.Count == 2 && lista[0].id == 1 && lista[0].user1.Id == 8 && lista[1].user2.Id == 6 && lista[1].user2.Name == "antony");
				
				Console.WriteLine("Serialized List<{0}>:", typeof(Customer));
                Console.WriteLine(JsonConvert.SerializeObject(lista, Formatting.Indented));
            }
        }

        static DataTable GetDataTable()
        {
            var json = @"[
   {
      ""id"":1,
      ""id_user"":8,
      ""name"":""manuel"",
      ""id_user1"":2,
      ""name1"":""michael""
   },
   {
      ""id"":2,
      ""id_user"":3,
      ""name"":""friedrich"",
      ""id_user1"":6,
      ""name1"":""antony""
   }
]";
            return JsonConvert.DeserializeObject<DataTable>(json);
        }
    }

	public class Program
	{
		public static void Main()
		{
			Console.WriteLine("Environment version: " + Environment.Version);
			Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
			Console.WriteLine();

			try
			{
				TestClass.Test();
			}
			catch (Exception ex)
			{
				Console.WriteLine("Failed with unhandled exception: ");
				Console.WriteLine(ex);
				throw;
			}
		}
	}
;