C# 将JSON分解为列表<;列表<;KeyValuePair>&燃气轮机;结果为空
我从一个API获得一个JSON结果C# 将JSON分解为列表<;列表<;KeyValuePair>&燃气轮机;结果为空,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我从一个API获得一个JSON结果 {"Data":[[{"Key":"Proudct","Value":"PC"},{"Key":"Address","Value":"USA"},{"Key":"Tel","Value":"123456777&qu
{"Data":[[{"Key":"Proudct","Value":"PC"},{"Key":"Address","Value":"USA"},{"Key":"Tel","Value":"123456777"}]]}
我的模型课:
public class MyData
{
public List<List<KeyValuePair<string, string>>> Data {get; set;}
//public List<List<Dictionary<string, string>>> Data {get; set;}
}
公共类MyData
{
公共列表数据{get;set;}
//公共列表数据{get;set;}
}
我的职能
public async Task<MyData> GetDataAsync()
{
var response = await _httpClient.GetAsync("apiURL");
if (response.StatusCode == HttpStatusCode.OK)
{
string result = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<MyData>(result);
return data
}
return new MyData();
}
公共异步任务GetDataAsync()
{
var response=await_httpClient.GetAsync(“apirl”);
if(response.StatusCode==HttpStatusCode.OK)
{
字符串结果=wait response.Content.ReadAsStringAsync();
var data=JsonConvert.DeserializeObject(结果);
返回数据
}
返回新的MyData();
}
除非将KeyValuePair更改为Dictionary类型,否则结果始终为null。我不能使用字典,因为“键”有时不是唯一的,我不知道为什么列表不能按预期工作
提前感谢这可能是一个显而易见的解决方案,但您是否考虑过使用在线JSON到C Sharp转换器,例如 我决定试一试,得到了这个非常简单的类文件
namespace YourProjectName
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class Temperatures
{
[JsonProperty("Data")]
public List<List<Datum>> Data { get; set; }
}
public partial class Datum
{
[JsonProperty("Key")]
public string Key { get; set; }
[JsonProperty("Value")]
public string Value { get; set; }
}
public partial class Temperatures
{
public static Temperatures FromJson(string json) => JsonConvert.DeserializeObject<Temperatures>(json, YourProjectName.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this Temperatures self) => JsonConvert.SerializeObject(self, YourProjectName.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}
使其更符合您的代码
public async Task<MyData> GetDataAsync()
{
var response = await _httpClient.GetAsync("apiURL");
if (response.StatusCode == HttpStatusCode.OK)
{
string result = await response.Content.ReadAsStringAsync();
var data = Temperatures.FromJson(result );
return data
}
return new MyData();
}
公共异步任务GetDataAsync()
{
var response=await_httpClient.GetAsync(“apirl”);
if(response.StatusCode==HttpStatusCode.OK)
{
字符串结果=wait response.Content.ReadAsStringAsync();
var数据=温度.FromJson(结果);
返回数据
}
返回新的MyData();
}
这可能是一个显而易见的解决方案,但您是否考虑过使用在线JSON到C Sharp转换器,例如 我决定试一试,得到了这个非常简单的类文件
namespace YourProjectName
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class Temperatures
{
[JsonProperty("Data")]
public List<List<Datum>> Data { get; set; }
}
public partial class Datum
{
[JsonProperty("Key")]
public string Key { get; set; }
[JsonProperty("Value")]
public string Value { get; set; }
}
public partial class Temperatures
{
public static Temperatures FromJson(string json) => JsonConvert.DeserializeObject<Temperatures>(json, YourProjectName.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this Temperatures self) => JsonConvert.SerializeObject(self, YourProjectName.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}
使其更符合您的代码
public async Task<MyData> GetDataAsync()
{
var response = await _httpClient.GetAsync("apiURL");
if (response.StatusCode == HttpStatusCode.OK)
{
string result = await response.Content.ReadAsStringAsync();
var data = Temperatures.FromJson(result );
return data
}
return new MyData();
}
公共异步任务GetDataAsync()
{
var response=await_httpClient.GetAsync(“apirl”);
if(response.StatusCode==HttpStatusCode.OK)
{
字符串结果=wait response.Content.ReadAsStringAsync();
var数据=温度.FromJson(结果);
返回数据
}
返回新的MyData();
}
在您的原始帖子中,您向我们提供了一个JSON示例,如下所示:
{
"Data": [[{
"Key": "Proudct",
"Value": "PC"
}, {
"Key": "Address",
"Value": "USA"
}, {
"Key": "Tel",
"Value": "123456777"
}
]]
}
这是你需要的!但当我要求您(在评论中)提供从API返回的实际JSON时,您提供了以下内容:
{
"Data": [[{
"Käyttäjä": "Timo Kaisla"
}, {
"Kustannuspaikka": "5150014"
}, {
"Henkilö nro": "49417"
}
]]
}
这是行不通的。你可能知道原因。您最初提供的JSON与实际的JSON不一样。现在我可以看到这两组JSON,这就很好地解释了为什么实际的JSON可以序列化到字典中,但不能序列化到键值对中
下面的代码从API调用返回的JSON中获取一个列表
:
public class MyData
{
public List<List<Dictionary<string, string>>> Data {get; set;}
}
static void Main()
{
// Using your actual JSON from the api:
string data = "{\"Data\": [[{\"Käyttäjä\": \"Timo Kaisla\" },{\"Kustannuspaikka\": \"5150014\"},{\"Henkilö nro\": \"49417\"}]]}";
// Deserialize to MyData
MyData myData = JsonConvert.DeserializeObject<MyData>(data);
// Extract the inner List to a List<Dictionary>
List<Dictionary<string, string>> dictionary = myData.Data[0];
// Create our finished object
List<KeyValuePair<string, string>> keyvaluepairs = new List<KeyValuePair<string, string>>();
// Loop over the List<Dictionary> and convert to List<KeyValuePair<>>
foreach (var x in dictionary)
{
var key = x.ToList()[0].Key;
var value = x.ToList()[0].Value;
KeyValuePair<string, string> keyvaluepair = new KeyValuePair<string, string>(key, value);
keyvaluepairs.Add(keyvaluepair);
}
}
公共类MyData
{
公共列表数据{get;set;}
}
静态void Main()
{
//使用api中的实际JSON:
字符串数据=“{\'data\”:[[{\'Käyttäjä\”:\'Timo Kaisla\”,{\'kustannupaikka\:\'5150014\”,{\'Henkilönro\:'49417\']}”;
//反序列化到MyData
MyData MyData=JsonConvert.DeserializeObject(数据);
//将内部列表提取到列表中
列表字典=myData.Data[0];
//创建完成的对象
List keyvaluepairs=新列表();
//在列表上循环并转换为列表
foreach(字典中的变量x)
{
var key=x.ToList()[0].key;
var value=x.ToList()[0]。值;
KeyValuePair KeyValuePair=新的KeyValuePair(键,值);
添加(keyvaluepair);
}
}
此代码完成时,keyvaluepairs
将具有您要查找的列表
当然有一种更简单的方法可以做到这一点(使用LINQ),但这会将其分解,以便您可以看到发生了什么。在您的原始帖子中,您向我们提供了一个类似以下内容的JSON示例:
{
"Data": [[{
"Key": "Proudct",
"Value": "PC"
}, {
"Key": "Address",
"Value": "USA"
}, {
"Key": "Tel",
"Value": "123456777"
}
]]
}
这是你需要的!但当我要求您(在评论中)提供从API返回的实际JSON时,您提供了以下内容:
{
"Data": [[{
"Käyttäjä": "Timo Kaisla"
}, {
"Kustannuspaikka": "5150014"
}, {
"Henkilö nro": "49417"
}
]]
}
这是行不通的。你可能知道原因。您最初提供的JSON与实际的JSON不一样。现在我可以看到这两组JSON,这就很好地解释了为什么实际的JSON可以序列化到字典中,但不能序列化到键值对中
下面的代码从API调用返回的JSON中获取一个列表
:
public class MyData
{
public List<List<Dictionary<string, string>>> Data {get; set;}
}
static void Main()
{
// Using your actual JSON from the api:
string data = "{\"Data\": [[{\"Käyttäjä\": \"Timo Kaisla\" },{\"Kustannuspaikka\": \"5150014\"},{\"Henkilö nro\": \"49417\"}]]}";
// Deserialize to MyData
MyData myData = JsonConvert.DeserializeObject<MyData>(data);
// Extract the inner List to a List<Dictionary>
List<Dictionary<string, string>> dictionary = myData.Data[0];
// Create our finished object
List<KeyValuePair<string, string>> keyvaluepairs = new List<KeyValuePair<string, string>>();
// Loop over the List<Dictionary> and convert to List<KeyValuePair<>>
foreach (var x in dictionary)
{
var key = x.ToList()[0].Key;
var value = x.ToList()[0].Value;
KeyValuePair<string, string> keyvaluepair = new KeyValuePair<string, string>(key, value);
keyvaluepairs.Add(keyvaluepair);
}
}
公共类MyData
{
公共列表数据{get;set;}
}
静态void Main()
{
//使用api中的实际JSON:
字符串数据=“{\'data\”:[[{\'Käyttäjä\”:\'Timo Kaisla\”,{\'kustannupaikka\:\'5150014\”,{\'Henkilönro\:'49417\']}”;
//反序列化到MyData
MyData MyData=JsonConvert.DeserializeObject(数据);
//将内部列表提取到列表中
列表字典=myData.Data[0];
//创建完成的对象
List keyvaluepairs=新列表();
//在列表上循环并转换为列表
foreach(字典中的变量x)
{
var key=x.ToList()[0].key;
var value=x.ToList()[0]。值;
KeyValuePair KeyValuePair=新的KeyValuePair(键,值);
添加(keyvaluepair);
}
}
此代码完成时,keyvaluepairs
将具有您要查找的列表
当然有一种更简单的方法(使用LINQ),但这会将其分解,以便您可以看到发生了什么。您将Result
作为属性名,而Data
作为JSON键。提示:在以后的问题中,请确保完全包含您的JSON数据。似乎您缺少了一对周围的{}
。此外,尝试手动构造列表的一个实例,并将其序列化为JSON,以查看它是否真正代表您接收的数据的结构创建一个对象,设置一些值,序列化为文本,然后查看您得到了什么。然后你可以找出什么不匹配。比询问stackoverflow要快得多。或者在Visual StudioOk中使用“将JSON粘贴为类”,谢谢您的编辑。我无法复制您的问题。德