C# 反序列化时如何检查JSON字符串中是否存在属性
我有反序列化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字符串有这样一个属性:(请注意,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?
你需要试试状态布尔值。。。