Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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_Linq - Fatal编程技术网

C#比较中的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

我以前从未使用过JSON数据。我正在尝试反序列化以下行:

{“邮件”:[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;
打破
}
}
  • 您需要表示一个对象,以便JSON能够理解
  • 使用 对象 得到
  • 构建一个json类以与创建、添加、编辑和删除交互。首先,我们需要将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);
    }
    
    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);
    }