/// <summary> /// Read the <see cref="HttpContent"/> as OData resource set. /// </summary> /// <param name="content">The http content.</param> /// <returns>The OData array.</returns> public static async Task <ODataArray> ReadAsODataArrayAsync(this HttpContent content) { if (content == null) { throw new ArgumentNullException(nameof(content)); } Stream stream = await content.ReadAsStreamAsync(); using (JsonDocument doc = await JsonDocument.ParseAsync(stream)) { JsonElement root = doc.RootElement; // OData array is an object as: // { // "@odata.context":... // "value" [ ... ] // } if (root.ValueKind != JsonValueKind.Object) { return(null); } if (!root.TryGetProperty("value", out JsonElement value) && value.ValueKind != JsonValueKind.Array) { return(null); } ODataArray odataArray = new ODataArray(); // value array foreach (var item in value.EnumerateArray()) { IODataValue itemValue = item.ParseAsODataValue(); odataArray.Add(itemValue); } // context uri odataArray.ContextUri = ReadStringPropertyValue(root, "@odata.context", "@context"); // next link odataArray.NextLink = ReadStringPropertyValue(root, "@odata.nextlink", "@nextlink"); // odata.count odataArray.TotalCount = ReadIntPropertyValue(root, "@odata.count", "@count"); return(odataArray); } }
/// <summary> /// Read the <see cref="HttpContent"/> as OData resource. /// </summary> /// <param name="content">The http content.</param> /// <returns>The OData object.</returns> public static async Task <ODataObject> ReadAsODataObjectAsync(this HttpContent content) { if (content == null) { throw new ArgumentNullException(nameof(content)); } Stream stream = await content.ReadAsStreamAsync(); using (JsonDocument doc = await JsonDocument.ParseAsync(stream)) { JsonElement root = doc.RootElement; // OData object is an object as: // { // "@odata.context":... // "Id": 2, // "Name: "Sam" // } if (root.ValueKind != JsonValueKind.Object) { return(null); } ODataObject odataObject = new ODataObject(); // value array foreach (JsonProperty property in root.EnumerateObject()) { if (property.Name == "@odata.context" || property.Name == "@context") { // context uri odataObject.ContextUri = property.Value.GetString(); } else { IODataValue itemValue = property.Value.ParseAsODataValue(); odataObject[property.Name] = itemValue; } } return(odataObject); } }