Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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字符串,但无法对其进行反序列化_C#_Json_Serialization_Foreach_Jsonresult - Fatal编程技术网

C#正在接收json字符串,但无法对其进行反序列化

C#正在接收json字符串,但无法对其进行反序列化,c#,json,serialization,foreach,jsonresult,C#,Json,Serialization,Foreach,Jsonresult,我有一个应用程序,它必须使用NuGet的Netwonsoft.Json包反序列化封装在“results”根对象中的数据数组 Json字符串就是这样的: {"results":[{"Coin":"SBD","LP":0.000269,"PBV":-54.36,"MACD1M":true,"MACD30M":true,"MACD1H":true,"MACD1D":true},{"Coin":"XMR","LP":0.027135,"PBV":11.44,"MACD1M":true,"MACD30M"

我有一个应用程序,它必须使用NuGet的Netwonsoft.Json包反序列化封装在“results”根对象中的数据数组

Json字符串就是这样的:

{"results":[{"Coin":"SBD","LP":0.000269,"PBV":-54.36,"MACD1M":true,"MACD30M":true,"MACD1H":true,"MACD1D":true},{"Coin":"XMR","LP":0.027135,"PBV":11.44,"MACD1M":true,"MACD30M":true,"MACD1H":true,"MACD1D":true}]}
这个Json字符串是从我制作的控制台应用程序创建的,我希望它看起来像这样

我的班级看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp2
{
    public class Result
    {
        public string Coins { get; set; }
        public decimal LastPrice { get; set; }
        public decimal PercentBuyVolume { get; set; }
    }

    public class RootObject
    {
        public List<Result> results { get; set; }
    }
}
输出如下所示:

private void DownloadBittrexData()
        {

            int PanelID = 0;
            var Coin = new List<string>();
            var LastPrice = new List<decimal>();
            var PercentBuyVolume = new List<decimal>();
            var MACD1M = new List<bool>();
            var MACD30M = new List<bool>();
            var MACD1H = new List<bool>();
            var MACD1D = new List<bool>();

            var client = new WebClient();

            var URL = client.DownloadString("http://localhost/test.json");
            Console.WriteLine("Json String from URL: " + URL);
            var dataDeserialized = JsonConvert.DeserializeObject<RootObject>(URL);
            foreach (var data in dataDeserialized.results)
            {
                Coin.Add(data.Coins);
                LastPrice.Add(data.LastPrice);
                PercentBuyVolume.Add(data.PercentBuyVolume);

            }
            int sizeOfArrayClose = Coin.Count - 1;

            for (int i = 0; i <= sizeOfArrayClose; i++)
            {
                Console.WriteLine("Coin: " + Coin[i]);
                Console.WriteLine("Lastprice: " + LastPrice[i]);
                Console.WriteLine("PBV: " + PercentBuyVolume[i]);
            }
        }
Json String from URL: {"results":[{"Coin":"SBD","LP":0.000269,"PBV":-54.36,"MACD1M":true,"MACD30M":true,"MACD1H":true,"MACD1D":true},{"Coin":"XMR","LP":0.027135,"PBV":11.44,"MACD1M":true,"MACD30M":true,"MACD1H":true,"MACD1D":true}]}
Coin: 
Lastprice: 0
PBV: 0
Coin: 
Lastprice: 0
PBV: 0
就像下载后无法反序列化一样。
我该怎么办?非常感谢。

对于反序列化json,您的模型应该是这样的

public class Result
{
    public string Coin { get; set; }
    public double LP { get; set; }
    public double PBV { get; set; }
    public bool MACD1M { get; set; }
    public bool MACD30M { get; set; }
    public bool MACD1H { get; set; }
    public bool MACD1D { get; set; }
}

public class RootObject
{
    public List<Result> results { get; set; }
}
公共类结果
{
公共字符串硬币{get;set;}
公共双LP{get;set;}
公共双PBV{get;set;}
公共布尔MACD1M{get;set;}
公共bool MACD30M{get;set;}
公共布尔MACD1H{get;set;}
公共布尔MACD1D{get;set;}
}
公共类根对象
{
公共列表结果{get;set;}
}

LastPrice和PercentBuyVolume在您的模型中不可用,这就是它出错的原因。

对于反序列化json,您的模型应该是这样的

public class Result
{
    public string Coin { get; set; }
    public double LP { get; set; }
    public double PBV { get; set; }
    public bool MACD1M { get; set; }
    public bool MACD30M { get; set; }
    public bool MACD1H { get; set; }
    public bool MACD1D { get; set; }
}

public class RootObject
{
    public List<Result> results { get; set; }
}
公共类结果
{
公共字符串硬币{get;set;}
公共双LP{get;set;}
公共双PBV{get;set;}
公共布尔MACD1M{get;set;}
公共bool MACD30M{get;set;}
公共布尔MACD1H{get;set;}
公共布尔MACD1D{get;set;}
}
公共类根对象
{
公共列表结果{get;set;}
}

LastPrice和PercentBuyVolume在您的模型中不可用,这就是它出错的原因。

您的属性名没有映射到JSON中的字段名。您可以重命名C#属性以匹配JSON,但这会导致下游代码无法读取

相反,您应该使用
JsonPropertyAttribute
,将您的属性(具有漂亮、可读的名称)映射到JSON中显示的名称:

public class Result
{
    public string Coin { get; set; } //didn't bother here: changed property name to Coin
    [JsonProperty("LP")]
    public decimal LastPrice { get; set; }
    [JsonProperty("PBV")]
    public decimal PercentBuyVolume { get; set; }
}

属性名不会映射到JSON中的字段名。您可以重命名C#属性以匹配JSON,但这会导致下游代码无法读取

相反,您应该使用
JsonPropertyAttribute
,将您的属性(具有漂亮、可读的名称)映射到JSON中显示的名称:

public class Result
{
    public string Coin { get; set; } //didn't bother here: changed property name to Coin
    [JsonProperty("LP")]
    public decimal LastPrice { get; set; }
    [JsonProperty("PBV")]
    public decimal PercentBuyVolume { get; set; }
}

我在我的系统上尝试了你的精确代码,我能够按预期检索结果。希望这有帮助,这很容易理解

这是主课

 static void Main(string[] args)
    {

        RootObject configfile = LoadJson();

        foreach (var tResult in configfile.results)
        {
            Console.WriteLine("Coin: " + tResult.Coin);
            Console.WriteLine("Lastprice: " + tResult.LP);
            Console.WriteLine("PBV: " + tResult.PBV);
        }


        Console.ReadLine();

    }
LoadJson函数将是

 private static RootObject LoadJson()
    {
        string json = "{\"results\":[{\"Coin\":\"SBD\",\"LP\":0.000269,\"PBV\":-54.36,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true},{\"Coin\":\"XMR\",\"LP\":0.027135,\"PBV\":11.44,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true}]}";



        RootObject configs = Deserialize<RootObject>(json);
        return configs;
    }
private static T Deserialize<T>(string json)
    {
        T unsecureResult;
       string _DateTypeFormat = "yyyy-MM-dd HH:mm:ss";
        DataContractJsonSerializerSettings serializerSettings = new DataContractJsonSerializerSettings();
        DataContractJsonSerializer serializer;
        MemoryStream ms;
        unsecureResult = default(T);
        serializerSettings.DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);

        serializer = new DataContractJsonSerializer(typeof(T));
        ms = new MemoryStream(Encoding.Unicode.GetBytes(json));

        unsecureResult = (T)serializer.ReadObject(ms);

        return unsecureResult;
    }
private static RootObject LoadJson()
{
字符串json=“{\'results\”:[{\'Coin\':\'SBD\',\'LP\':0.000269,\'PBV\':-54.36,\'MACD1M\':true,\'macd3M\':true,\'MACD1H\':true,\'MACD1D\':true,{\'Coin\':\'XMR\',\'LP\':0.027135,\'PBV\':11.44,\'MACD1M\':true,\'macd3M\';
RootObject configs=反序列化(json);
返回配置;
}
反序列化函数将是

 private static RootObject LoadJson()
    {
        string json = "{\"results\":[{\"Coin\":\"SBD\",\"LP\":0.000269,\"PBV\":-54.36,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true},{\"Coin\":\"XMR\",\"LP\":0.027135,\"PBV\":11.44,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true}]}";



        RootObject configs = Deserialize<RootObject>(json);
        return configs;
    }
private static T Deserialize<T>(string json)
    {
        T unsecureResult;
       string _DateTypeFormat = "yyyy-MM-dd HH:mm:ss";
        DataContractJsonSerializerSettings serializerSettings = new DataContractJsonSerializerSettings();
        DataContractJsonSerializer serializer;
        MemoryStream ms;
        unsecureResult = default(T);
        serializerSettings.DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);

        serializer = new DataContractJsonSerializer(typeof(T));
        ms = new MemoryStream(Encoding.Unicode.GetBytes(json));

        unsecureResult = (T)serializer.ReadObject(ms);

        return unsecureResult;
    }
private static T反序列化(字符串json)
{
未治愈的结果;
字符串_DateTypeFormat=“yyyy-MM-dd HH:MM:ss”;
DataContractJsonSerializerSettings serializerSettings=新DataContractJsonSerializerSettings();
DataContractJsonSerializer序列化程序;
记忆流质谱;
unsecureResult=默认值(T);
serializerSettings.DateTimeFormat=new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);
serializer=新的DataContractJsonSerializer(typeof(T));
ms=newmemoryStream(Encoding.Unicode.GetBytes(json));
unsecureResult=(T)serializer.ReadObject(ms);
返回结果;
}
现在,您的数据模型将是

public class Result
{

    public string Coin { get; set; }
    public double LP { get; set; }
    public double PBV { get; set; }
    public bool MACD1M { get; set; }
    public bool MACD30M { get; set; }
    public bool MACD1H { get; set; }
    public bool MACD1D { get; set; }

}

public class RootObject
{
    public List<Result> results { get; set; }
}
公共类结果
{
公共字符串硬币{get;set;}
公共双LP{get;set;}
公共双PBV{get;set;}
公共布尔MACD1M{get;set;}
公共bool MACD30M{get;set;}
公共布尔MACD1H{get;set;}
公共布尔MACD1D{get;set;}
}
公共类根对象
{
公共列表结果{get;set;}
}

我在我的系统上尝试了您的精确代码,并且能够按预期检索结果。希望这有帮助,这很容易理解

这是主课

 static void Main(string[] args)
    {

        RootObject configfile = LoadJson();

        foreach (var tResult in configfile.results)
        {
            Console.WriteLine("Coin: " + tResult.Coin);
            Console.WriteLine("Lastprice: " + tResult.LP);
            Console.WriteLine("PBV: " + tResult.PBV);
        }


        Console.ReadLine();

    }
LoadJson函数将是

 private static RootObject LoadJson()
    {
        string json = "{\"results\":[{\"Coin\":\"SBD\",\"LP\":0.000269,\"PBV\":-54.36,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true},{\"Coin\":\"XMR\",\"LP\":0.027135,\"PBV\":11.44,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true}]}";



        RootObject configs = Deserialize<RootObject>(json);
        return configs;
    }
private static T Deserialize<T>(string json)
    {
        T unsecureResult;
       string _DateTypeFormat = "yyyy-MM-dd HH:mm:ss";
        DataContractJsonSerializerSettings serializerSettings = new DataContractJsonSerializerSettings();
        DataContractJsonSerializer serializer;
        MemoryStream ms;
        unsecureResult = default(T);
        serializerSettings.DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);

        serializer = new DataContractJsonSerializer(typeof(T));
        ms = new MemoryStream(Encoding.Unicode.GetBytes(json));

        unsecureResult = (T)serializer.ReadObject(ms);

        return unsecureResult;
    }
private static RootObject LoadJson()
{
字符串json=“{\'results\”:[{\'Coin\':\'SBD\',\'LP\':0.000269,\'PBV\':-54.36,\'MACD1M\':true,\'macd3M\':true,\'MACD1H\':true,\'MACD1D\':true,{\'Coin\':\'XMR\',\'LP\':0.027135,\'PBV\':11.44,\'MACD1M\':true,\'macd3M\';
RootObject configs=反序列化(json);
返回配置;
}
反序列化函数将是

 private static RootObject LoadJson()
    {
        string json = "{\"results\":[{\"Coin\":\"SBD\",\"LP\":0.000269,\"PBV\":-54.36,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true},{\"Coin\":\"XMR\",\"LP\":0.027135,\"PBV\":11.44,\"MACD1M\":true,\"MACD30M\":true,\"MACD1H\":true,\"MACD1D\":true}]}";



        RootObject configs = Deserialize<RootObject>(json);
        return configs;
    }
private static T Deserialize<T>(string json)
    {
        T unsecureResult;
       string _DateTypeFormat = "yyyy-MM-dd HH:mm:ss";
        DataContractJsonSerializerSettings serializerSettings = new DataContractJsonSerializerSettings();
        DataContractJsonSerializer serializer;
        MemoryStream ms;
        unsecureResult = default(T);
        serializerSettings.DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);

        serializer = new DataContractJsonSerializer(typeof(T));
        ms = new MemoryStream(Encoding.Unicode.GetBytes(json));

        unsecureResult = (T)serializer.ReadObject(ms);

        return unsecureResult;
    }
private static T反序列化(字符串json)
{
未治愈的结果;
字符串_DateTypeFormat=“yyyy-MM-dd HH:MM:ss”;
DataContractJsonSerializerSettings serializerSettings=新DataContractJsonSerializerSettings();
DataContractJsonSerializer序列化程序;
记忆流质谱;
unsecureResult=默认值(T);
serializerSettings.DateTimeFormat=new System.Runtime.Serialization.DateTimeFormat(_DateTypeFormat);
serializer=新的DataContractJsonSerializer(typeof(T));
ms=newmemoryStream(Encoding.Unicode.GetBytes(json));
unsecureResult=(T)serializer.ReadObject(ms);
返回结果;
}
现在,您的数据模型将是

public class Result
{

    public string Coin { get; set; }
    public double LP { get; set; }
    public double PBV { get; set; }
    public bool MACD1M { get; set; }
    public bool MACD30M { get; set; }
    public bool MACD1H { get; set; }
    public bool MACD1D { get; set; }

}

public class RootObject
{
    public List<Result> results { get; set; }
}
公共类结果
{
公共字符串硬币{get;set;}
公共双LP{get;set;}
公共双PBV{get;set;}
公共布尔MACD1M{get;set;}
公共bool MACD30M{get;set;}
公共布尔MACD1H{get;set;}
公共布尔MACD1D{get;set;}
}
公共类根对象
{
公共列表结果{get;set;}
}

json是正确的。在这个JSON字符串中,没有名为LastPrice和PercentByVolume的字段。你有没有一些你没有展示过的映射代码来解决这个问题?没有,但是我想我得到了解决方案,多亏了David Watts。我需要打电话