C#正在接收json字符串,但无法对其进行反序列化
我有一个应用程序,它必须使用NuGet的Netwonsoft.Json包反序列化封装在“results”根对象中的数据数组 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"
{"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。我需要打电话