Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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_Binding_Deserialization - Fatal编程技术网

C# 反序列化时如何检查JSON字符串中是否存在属性

C# 反序列化时如何检查JSON字符串中是否存在属性,c#,json,binding,deserialization,C#,Json,Binding,Deserialization,我有反序列化JSON字符串的代码。 现在我们可以看到JSON字符串有这样一个属性:(请注意,CORS属性存在于“has”属性下,因此我们需要检查“has”是否也存在,然后再返回) CORS 我的问题是。有时JSON字符串中可能缺少此属性。如图所示,我在使用try/catch块的地方使用了下面的代码。因为如果缺少CORS属性,我会得到一个异常,但是异常的性能非常昂贵,现在我在30个属性上使用try/catch块 然后我想知道我们如何用代码检查CORS属性是否首先存在?当CORS不存在时,下面不带t

我有反序列化JSON字符串的代码。
现在我们可以看到JSON字符串有这样一个属性:(请注意,CORS属性存在于“has”属性下,因此我们需要检查“has”是否也存在,然后再返回)

CORS

我的问题是。有时JSON字符串中可能缺少此属性。如图所示,我在使用try/catch块的地方使用了下面的代码。因为如果缺少CORS属性,我会得到一个异常,但是异常的性能非常昂贵,现在我在30个属性上使用try/catch块

然后我想知道我们如何用代码检查CORS属性是否首先存在?当CORS不存在时,下面不带try/catch的代码行出现此错误:

无法对空引用执行运行时绑定

String corsvalue = "";
try { corsvalue = deserializedTicker.has.CORS.ToLower(); } catch { }
JSON字符串:

{ 
  "id": "hello", 
  "name": "Hello",
  "has": { 
    "CORS": false,
    "CORS2": true
  },
  "has2": { 
    "CORS3": false,
    "CORS4": true
  }
}
完整代码:

String JSONstring = "{ \"id\": \"hello\", \"name\": \"Hello\", \"has\": { \"CORS\": false, \"CORS2\": true }, \"has2\": { \"CORS3\": false, \"CORS4\": true } }\";"

var deserializedTicker = JsonConvert.DeserializeObject<JsonInfo>(JSONstring);

String corsvalue = "";
try { corsvalue = deserializedTicker.has.CORS.ToLower(); } catch { }


public class JsonInfo 
{
  public string id { get; set; }
  public string name { get; set; }
  public JsonHasInfo has { get; set; }
  public JsonHas2Info has2 { get; set; }
}

public class JsonHasInfo
{
  public bool CORS { get; set; }
  public bool CORS2 { get; set; }
}

public class JsonHas2Info
{
  public bool CORS3 { get; set; }
  public bool CORS4 { get; set; }
}
String JSONstring=“{\'id\':\'hello\',\'name\':\'hello\',\'has\':{\'CORS\':false,\'CORS2\':true},\'has2\':{\'CORS3\':false,\'CORS4\':true}”;"
var deserializedTicker=JsonConvert.DeserializeObject(JSONstring);
字符串corsvalue=“”;
请尝试{corsvalue=deserializedTicker.has.CORS.ToLower();}catch{}
公共类JsonInfo
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
公共JsonHasInfo具有{get;set;}
公共JsonHas2Info has2{get;set;}
}
公共类JsonHasInfo
{
公共布尔CORS{get;set;}
公共布尔CORS2{get;set;}
}
公共类JsonHas2Info
{
公共布尔CORS3{get;set;}
公共布尔CORS4{get;set;}
}
给你:

String JSONstring = "{ \"id\": \"hello\", \"name\": \"Hello\", \"has\": { \"CORS\": false, \"CORS2\": true }, \"has2\": { \"CORS3\": false, \"CORS4\": true }}";

            JObject jobject = JObject.Parse(JSONstring);

            JToken cors = jobject.SelectToken("has.CORS");
            if (cors != null)
            {
                JsonInfo myEvent = jobject.ToObject<JsonInfo>();
            }
String JSONstring=“{\'id\':\'hello\',\'name\':\'hello\',\'has\':{\'CORS\':false,\'CORS2\':true},\'has2\':{\'CORS3\':false,\'CORS4\':true}”;
JObject=JObject.Parse(JSONstring);
JToken cors=jobject.SelectToken(“has.cors”);
如果(cors!=null)
{
JsonInfo myEvent=jobject.ToObject();
}

我知道用一个问题回答一个问题是不好的风格,但无论如何我都会这么做。我很抱歉。您试图通过对
bool
值调用
ToLower()
来实现什么(CORS是
bool
类型的属性)?这是什么意思?是的,我知道我把它放在一个字符串中,不是最好的,但很有效。我确实使用了一个字符串类型的字典,只是想把所有的值都放在字符串中,因为我的原始代码中有double、int和string。你已经仔细阅读了这篇文章了吗?(我认为它确实是重复的,但可能您要求的不是“检查属性是否为null的更好方法,而不是使用NRE进行流控制”)@alexei我没有红色,我可以看到链接非常大,有几页是红色的,但不确定如何准确地将其与此关联。我想知道这是一种有效的方法还是错误的?deserializedTicker.has!=null,然后检查:deserializedTicker.has.CORS!=null顺便说一句,一个属性(有时)序列化的Json数据中缺少的只是具有默认值的属性,而Json序列化程序忽略了使用默认值编写/序列化属性。我不知道您的动机/需要是什么,似乎需要您测试Json数据中是否显式存在属性;但我觉得这是一个odd要求有…@Alders是的,这似乎确实有效。我现在刚刚测试过。这看起来是一个很好的解决方案。谢谢!你真的应该使用
bool?
你需要试试状态布尔值。。。