public JsonApiCollectionDocument(IEnumerable <T> data, JsonApiErrors errors, object metadata = null, bool hasLinks = false, bool hasRelationships = false, bool hasIncludedData = false, Func <T, string> customIdResolver = null) { if (customIdResolver == null) { if (typeof(ICustomJsonModelId).IsAssignableFrom(typeof(T))) { customIdResolver = d => (d as ICustomJsonModelId)?.CustomJsonModelId; } else { customIdResolver = d => d.Id.ToString(); } } Meta = metadata; Errors = errors; if (data == null) { Data = null; Included = null; } else { Data = new List <JsonApiResourceObject <T> >(); foreach (var item in data) { JsonClassAttribute classAttrib = item.GetType().GetCustomAttributes(typeof(JsonClassAttribute), false).FirstOrDefault() as JsonClassAttribute; if (classAttrib == null) { throw new Exception("No class attribute specified for " + item.GetType().Name + "."); } var newDataItem = new JsonApiResourceObject <T>(customIdResolver(item), classAttrib.Name, item); if (hasRelationships) { newDataItem.Relationships = new JsonApiRelationshipsObject(); } Data.Add(newDataItem); } //TODO :replace is a hack to remove the "Model"-Part from the name, solve this as parameter in the future Included = !hasIncludedData ? null : new JsonApiInclusionCollection();//new List<JsonApiResourceObject>(); } Links = hasLinks ? new JsonApiLinksObject() : null; }
public IEnumerable <JsonApiResourceObject <T> > ExtractFromIncludes <T>() where T : JsonBaseModel { // create container for storing the result set List <JsonApiResourceObject <T> > results = new List <JsonApiResourceObject <T> >(); // gather meta info Type modeltype = typeof(T); var classattribs = modeltype.GetCustomAttributes(typeof(JsonClassAttribute), false); string modelName = (classattribs?.FirstOrDefault() as JsonClassAttribute)?.Name; //find relevant attributes in includes var data = Included.Where(x => x.Type.Equals(modelName)); //try to convert the included attributes to datamodels foreach (var resource in data) { string jsonString = resource.Attributes as string; JsonApiResourceObject <T> model = null; try { model = Newtonsoft.Json.Linq.JObject.Parse(jsonString)?.ToObject <JsonApiResourceObject <T> >(); } catch { } if (model == null) { continue; } //int id = -1; //int.TryParse(resource.Id, out id); //model.Id = id; //var resourceT = new JsonApiResourceObject<T>(resource.Id, resource.Type, model); //resourceT.Links = resource.Links; //resourceT.Relationships = resource.Relationships; results.Add(model); } return(results); }