Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#.Net存储不同响应类型的API结果集_C#_Asp.net Web Api - Fatal编程技术网

如何使用C#.Net存储不同响应类型的API结果集

如何使用C#.Net存储不同响应类型的API结果集,c#,asp.net-web-api,C#,Asp.net Web Api,我试图调用两个API并存储它们的响应。 以下是API响应类型: API1响应: { "Name": "Apple", "Expiry": "2008-12-28T00:00:00", "Price": 3.99, "Sizes": [ "Small", "Medium", "Large" ] } API2响应: ["Name=xyz, Id=1, Version=1","Name=abc, Id=1, Version=2","Name=hgf, Id=1, Version

我试图调用两个API并存储它们的响应。 以下是API响应类型:

API1响应:

{
  "Name": "Apple",
  "Expiry": "2008-12-28T00:00:00",
 "Price": 3.99,
 "Sizes": [
 "Small",
 "Medium",
 "Large"
  ]
}
API2响应:

["Name=xyz, Id=1, Version=1","Name=abc, Id=1, Version=2","Name=hgf, Id=1, Version=3","Name=utgds, Id=1, Version=4","Name=kfgf, Id=2, Version=1"]
下面是调用API并获取结果集的代码

var jsonObj = Get<SomeClass>("API_URL1");
var jsonObj2 = Get<Test>("API_URL2");

 public T Get<T>(string requestUri)
        {
            T response = default(T);
            using (var handler = new HttpClientHandler { Credentials = CredentialCache.DefaultNetworkCredentials })
            {
                using (var httpClient = CreateNewRequest(handler))
                {
                    var httpTask = httpClient.GetAsync(requestUri);
                    var response = task.Result;
                    response.EnsureSuccessStatusCode();
                    if (response.IsSuccessStatusCode)
                    {
                        var result = response.Content.ReadAsStringAsync().Result;
                        var res = JsonConvert.DeserializeObject<T>(result);

                    }
                }
            }
            return res;
        }

 private HttpClient CreateNewRequest(HttpClientHandler handler)
    {
        HttpClient client = new HttpClient(handler);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        return client;
    }

public class Test
{
    public string Name { get; set; }
    public int Id { get; set; }
    public int Version { get; set; }


}
var jsonObj=Get(“API_URL1”); var jsonObj2=Get(“API_URL2”); 公共T获取(字符串请求URI) { T响应=默认值(T); 使用(var handler=new-HttpClientHandler{Credentials=CredentialCache.DefaultNetworkCredentials}) { 使用(var httpClient=CreateNewRequest(处理程序)) { var httpTask=httpClient.GetAsync(requestUri); var response=task.Result; response.EnsureSuccessStatusCode(); if(响应。IsSuccessStatusCode) { var result=response.Content.ReadAsStringAsync().result; var res=JsonConvert.DeserializeObject(结果); } } } 返回res; } 私有HttpClient CreateNewRequest(HttpClientHandler处理程序) { HttpClient=新的HttpClient(处理程序); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”); 返回客户; } 公开课考试 { 公共字符串名称{get;set;} 公共int Id{get;set;} 公共int版本{get;set;} } 类似地,我创建了一个类来保存API1响应。 我能够存储API1响应,但是在存储API2响应时,我收到了此错误消息

无法将当前JSON数组(例如[1,2,3])反序列化为类型 因为该类型需要一个JSON对象(例如{“name”:“value”})来 正确地反序列化。要修复此错误,请将JSON更改为 JSON对象(例如{“name”:“value”})或将反序列化类型更改为 实现集合接口的数组或类型

对此有什么想法/提示吗


谢谢

我测试了我在评论中说的话。第二个响应是字符串的JSON数组。您应该将其反序列化为字符串数组(
string[]
)或字符串集合(
List
)。按预期进行以下工作:

var response = "[\"Name=xyz, Id=1, Version=1\", \"Name=abc, Id=1, Version=2\", \"Name=hgf, Id=1, Version=3\", \"Name=utgds, Id=1, Version=4\", \"Name=kfgf, Id=2, Version=1\"]";
var result = JsonConvert.DeserializeObject<string[]>(response);
var response=“[\”Name=xyz,Id=1,Version=1\”,\“Name=abc,Id=1,Version=2\”,\“Name=hgf,Id=1,Version=3\”,\“Name=utgds,Id=1,Version=4\”,\“Name=kfgf,Id=2,Version=1\”;
var result=JsonConvert.DeserializeObject(响应);
总结:使用
Get
代替
Get
。您只需要解析字符串,但这似乎是另一个问题


下面的完整演示(故意模拟url调用):

类程序
{
静态void Main(字符串[]参数)
{
var invoker=new JsonMockInvoker();
var jsonObj=invoker.Get(“API_URL1”);
var jsonObj2=invoker.Get(“API_URL2”);
}
}
上课
{
公共字符串名称{get;set;}
//其他属性
}
公共类JsonMockInvoker:JsonInvoker
{
公共重写字符串调用列表(字符串url)
{
如果(url==“API_URL1”)
返回“{”Name\”:“Apple\”,“expiration\”:“2008-12-28:00:00\”,“Price\”:3.99,““size\”:[“Small\”,“Medium\”,“Large\”];
如果(url==“API_URL2”)
返回“[\”Name=xyz,Id=1,Version=1\”,\“Name=abc,Id=1,Version=2\”,\“Name=hgf,Id=1,Version=3\”,\“Name=utgds,Id=1,Version=4\”,\“Name=kfgf,Id=2,Version=1\”;
抛出新的NotImplementedException();
}
}
公共类JsonInvoker
{
公共T获取(字符串请求URI)
{
var result=InvokeRest(requestUri);
返回结果!=null?JsonConvert.DeserializeObject(结果):默认值(T);
}
公共虚拟字符串调用列表(字符串url)
{
使用(var handler=new-HttpClientHandler{Credentials=CredentialCache.DefaultNetworkCredentials})
使用(var httpClient=CreateNewRequest(处理程序))
{
var httpTask=httpClient.GetAsync(url);
var response=httpTask.Result;
response.EnsureSuccessStatusCode();
if(响应。IsSuccessStatusCode)
{
返回response.Content.ReadAsStringAsync().Result;
}
}
返回null;
}
私有HttpClient CreateNewRequest(HttpClientHandler处理程序)
{
HttpClient=新的HttpClient(处理程序);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
返回客户;
}
}
字符串值不是JSON格式-您必须手动解析它们:

//parse to typed object
var parsedObject = jsonObj2.Select(a => new
{
    Id = Regex.Match(a, "(?<=Id=)[^,]*").Value,
    Name = Regex.Match(a, "(?<=Name=)[^,]*").Value
});

//parse to dictionary
var regex = new Regex("([\\s]|^)(?<key>[^=]+)=(?<value>[^,]*)");
var parsed = jsonObj2.Select(a =>
{
    var dictionary = new Dictionary<string, string>();
    foreach (Match match in regex.Matches(a))
        dictionary[match.Groups["key"].Value] = match.Groups["value"].Value;
    return dictionary;
});
//解析到类型化对象
var parsedObject=jsonObj2.Select(a=>new
{

Id=Regex.Match(a,”(?第一个是对象,第二个是字符串的集合(数组)。Try
JsonConvert.DeserializeObject(api2Response)
。如果我使用上述反序列化方法,那么第一个api调用将不起作用。我正在尝试找到一种常见的方法,但这是一个问题。我扩展了我的答案-是的,它是可以实现的!谢谢Pawel。是的,它起作用了:)有没有一种方法可以根据名称和Id字段从jsonObj2进行搜索,因为它可能包含许多字符串对象?添加了解析-希望这就足够了:)
//parse to typed object
var parsedObject = jsonObj2.Select(a => new
{
    Id = Regex.Match(a, "(?<=Id=)[^,]*").Value,
    Name = Regex.Match(a, "(?<=Name=)[^,]*").Value
});

//parse to dictionary
var regex = new Regex("([\\s]|^)(?<key>[^=]+)=(?<value>[^,]*)");
var parsed = jsonObj2.Select(a =>
{
    var dictionary = new Dictionary<string, string>();
    foreach (Match match in regex.Matches(a))
        dictionary[match.Groups["key"].Value] = match.Groups["value"].Value;
    return dictionary;
});