C#比较中的JSON反序列化
我以前从未使用过JSON数据。我正在尝试反序列化以下行:C#比较中的JSON反序列化,c#,json,linq,C#,Json,Linq,我以前从未使用过JSON数据。我正在尝试反序列化以下行: {“邮件”:[null,{“ID”:”ulasdas@gmail.com,“Status”:true},{“ID”:ADSsdasA@ONO.COM“,“状态”:false}]} 我正在使用以下代码,但它不起作用: public Boolean checkValidLicense(string usermail) { Boolean validUser = false; HttpWebRequest req = WebR
{“邮件”:[null,{“ID”:”ulasdas@gmail.com,“Status”:true},{“ID”:ADSsdasA@ONO.COM“,“状态”:false}]}
我正在使用以下代码,但它不起作用:
public Boolean checkValidLicense(string usermail)
{
Boolean validUser = false;
HttpWebRequest req = WebRequest.Create("https://popping-heat-1908.firebaseio.com/.json") as HttpWebRequest;
using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
string json = reader.ReadToEnd();
dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
foreach (var item in result.Mails)
{
if (usermail == item.ID && item.Status == "true")
{
validUser = true;
break;
}
}
return validUser;
}
我得到:
“Newtonsoft.Json.Linq.JValue”不包含“ID”的定义
问题是您得到的响应的第一个值是
null
。这是您从请求中得到的结果:
{
"Mails": [
null,
{
"ID": "ulrickpspg@gmail.com",
"Status": true
},
{
"ID": "ADSA@ONO.COM",
"Status": false
}
]
}
所以换句话:
if (usermail == item.ID && item.Status == "true")
if (item.Value != null && usermail == item.ID && item.Status == "true")
直截了当地说:
if (usermail == item.ID && item.Status == "true")
if (item.Value != null && usermail == item.ID && item.Status == "true")
除非有充分的理由,否则不要反序列化为
动态
类型。而是创建一个要反序列化的类型。一个很好的工具是,尽管你可能经常需要对它无法推断的事情做一些小的调整。下面,我们上了两节课Mail
表示单个项目,MailCollection
是我们从中反序列化的根JSON对象,它只包含Mail
对象的集合
public class Mail
{
public string ID { get; set; }
public bool Status { get; set; }
}
//This is the root object, it's going to hold a collection of the mail
public class MailCollection
{
public List<Mail> Mails { get; set; }
}
//we pass a type parameter telling it what type to deserialize to
MailCollection result = Newtonsoft.Json.JsonConvert.DeserializeObject<MailCollection>(json);
foreach (var item in result.Mails)
{
if (usermail == item.ID && item.Status) //since item.Status is a bool, don't compare to a string.
{
validUser = true;
break;
}
}
公共类邮件
{
公共字符串ID{get;set;}
公共布尔状态{get;set;}
}
//这是根对象,它将保存邮件的集合
公共类邮件收集
{
公共列表邮件{get;set;}
}
//我们传递一个类型参数,告诉它反序列化到哪个类型
MailCollection结果=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
foreach(result.Mails中的var项)
{
如果(usermail==item.ID&&item.Status)//因为item.Status是bool,不要与字符串进行比较。
{
validUser=true;
打破
}
}
列表
:
public void EditMailItem(MailItem mailItem)
{
String jsonRead = File.ReadAllText(fullPath);
List<MailItem> mailItemList = JsonConvert.DeserializeObject<List<MailItem>>(jsonRead);
int indexOfMailItem = mailItemList.FindIndex(o => o.ID == mailItem.ID); //LINQ
mailItemList[indexOfMailItem] = mailItem;
String jsonWrite = JsonConvert.SerializeObject(mailItemList, Formatting.Indented);
File.WriteAllText(jsonWrite);
}
public void EditMailItem(MailItem-MailItem)
{
字符串jsonRead=File.ReadAllText(完整路径);
List-mailItemList=JsonConvert.DeserializeObject(jsonRead);
int indexOfMailItem=mailItemList.FindIndex(o=>o.ID==mailItem.ID);//LINQ
mailItemList[indexOfMailItem]=mailItem;
字符串jsonWrite=JsonConvert.SerializedObject(mailItemList,Formatting.Indented);
File.writealText(jsonWrite);
}
您能否创建一个类型化模型并使用泛型(
)API?这如何解决OP的问题?你只是在复制他已经发布的响应。你知道如何从Begging中删除null元素吗?是一次性的还是所有的json都是这种格式@Aldridge1991这是一个非常有用的工具,很少有人知道它直接包含在Visual Studio中!复制剪贴板中的JSON,然后转到C代码文件,然后编辑->粘贴特殊->将JSON粘贴为类。在大多数情况下都能很好地工作,并且可以对XML做同样的事情,为序列化添加属性等等。@Gimly我现在没有启动VS。这需要什么版本,是否需要任何特殊工具,如Mads Kristensen的Web Extensions?不确定是哪个版本启动的,但至少在2012年以后出现了。而且它是内置的,没有特殊的工具,直接在bare和ListMailslist=JsonConvert.DeserializeObject(json)中使用代码>什么是日志
?为什么Mails
仅代表一个Mail
对象时是复数?为什么要将JSON对象反序列化到C集合中?
public void AddMailItem(MailItem mailItem)
{
String json = File.ReadAllText(fullPath);
List<MailItem> mailItemList = JsonConvert.DeserializeObject<List<MailItem>>(json);
if (mailItemList == null)
mailItemList = new List<MailItem>();
mailItemList.Add(mailItem);
String json = JsonConvert.SerializeObject(mailItemList, Formatting.Indented);
File.WriteAllText(json);
}
public void EditMailItem(MailItem mailItem)
{
String jsonRead = File.ReadAllText(fullPath);
List<MailItem> mailItemList = JsonConvert.DeserializeObject<List<MailItem>>(jsonRead);
int indexOfMailItem = mailItemList.FindIndex(o => o.ID == mailItem.ID); //LINQ
mailItemList[indexOfMailItem] = mailItem;
String jsonWrite = JsonConvert.SerializeObject(mailItemList, Formatting.Indented);
File.WriteAllText(jsonWrite);
}