Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 将JSON分解为列表<;列表<;KeyValuePair>&燃气轮机;结果为空_C#_Asp.net Web Api_Json.net - Fatal编程技术网

C# 将JSON分解为列表<;列表<;KeyValuePair>&燃气轮机;结果为空

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

我从一个API获得一个JSON结果

{"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粘贴为类”,谢谢您的编辑。我无法复制您的问题。德