我想通过调用web API对JSON响应进行排序,并且只使用响应API中的最高概率和tagName。
我如何在C#中做到这一点,或者我需要使用任何lib吗?编辑:这是用来调用的代码。我对编码很陌生,谢谢你的每一个回复。我的程序过程是将图像数据发送到web并接收JSON数据响应
{
"predictions": [
{
"**probability**": 0.15588212,
"tagId": "5ac049bf-b01e-4dc7-b613-920c75579c41",
"**tagName**": "DH246F",
"boundingBox": {
"left": 0.4654134,
"top": 0.52319163,
"width": 0.16658843,
"height": 0.20959526
}
},
{
"probability": 0.11000415,
"tagId": "5ac049bf-b01e-4dc7-b613-920c75579c41",
"tagName": "DH246F",
"boundingBox": {
"left": 0.0,
"top": 0.18623778,
"width": 0.31140158,
"height": 0.81376123
}
}
]
}
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;
using System.IO;
namespace Rest_API_Test
{
static class Program
{
static void Main(string[] args)
{
string imageFilePath = @"C:Userswissarut.sDesktopTest CaptureLeft.png";
MakeRequest(imageFilePath);
Console.ReadLine();
}
public static async void MakeRequest(string imageFilePath)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Prediction-key", "****");
var uri = "*******************";
HttpResponseMessage response;
byte[] byteData = GetBytesFromImage(imageFilePath);
using (var content = new ByteArrayContent(byteData))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
response = await client.PostAsync(uri, content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Console.WriteLine("From Left Side Camera");
}
}
public static byte[] GetBytesFromImage(string imageFilePath)
{
FileStream fs = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
BinaryReader binReader = new BinaryReader(fs);
return binReader.ReadBytes((int)fs.Length);
}
}
}
为了对JSON进行排序,最好先将其反序列化为.NET对象,然后使用Linq进行排序。反序列化之后,内存中就有了内容,可以更好地处理。如果您需要一个具有排序内容的JSON,您可以在之后对其进行序列化。第一步是定义模拟JSON结构的类。您可以在Visual Studio中使用编辑->轻松完成此操作;粘贴特殊->将JSON粘贴为类。
之后,您可以将JSON字符串反序列化为对象。在这方面有各种各样的框架可以帮助你,最著名的是以下框架:
- System.Text.Json是.NET框架中包含的Json(反(序列化程序,因此如果您已经在使用.NET(可从.NET Core版本3获得(,则不需要额外的组件
- JSON.NET又名Newtonsoft.JSON,也可用于经典.NET Framework,例如.NET Framework 4.7及更低版本
在下面的示例中,我自己创建了类(Paste special会创建与.NET命名约定冲突的小写属性名(:
public class Container
{
public IEnumerable<Prediction> Predictions { get; set; }
}
public class Prediction
{
public decimal Probability { get; set; }
public Guid TagId { get; set; }
public string TagName { get; set; }
public BoundingBox BoundingBox { get; set; }
}
public class BoundingBox
{
public decimal Left { get; set; }
public decimal Top { get; set; }
public decimal Width { get; set; }
public decimal Height { get; set; }
}
之后,我将JSON存储在一个字符串中(但您可以使用从POST接收的字符串(,并使用System.Text.JSON:将其反序列化为对象结构
var options = new JsonSerializerOptions()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
var container = JsonSerializer.Deserialize<Container>(json, options);
上面的代码配置了选项,以便在读取时对属性名称应用驼色大小写。因此,小写的JSON属性名称被正确地映射到.NET类中的大写属性名称。
使用Linq方法OrderByDescending
和ThenBy
:可以很容易地对预测进行排序
container.Predictions = container.Predictions
.OrderByDescending(x => x.Probability)
.ThenBy(x => x.TagName);
结果如下:
0.15588212, DH246F, 5ac049bf-b01e-4dc7-b613-920c75579c41
0.11000415, DH246F, 5ac049bf-b01e-4dc7-b613-920c75579c41
要再次将对象结构序列化为JSON,可以使用以下方法:
var serialized = JsonSerializer.Serialize(container, options);
如果你没有大量的数据,这种方法会起作用——如果你处理网络请求的结果,通常情况就不是这样了。
看看这把小提琴来检查样品。
您可以在此处找到有关System.Net.Json的概述。