Можно искать ключ, который не существует в Json.net
У меня появилось несколько разных форматов, но я не могу понять, как их обрабатывать, потому что, когда я пытаюсь найти сбой по ключевым словам json.net. Я надеялся, что он просто вернет null.
foreach (var item in jsonObj)
{
var msg = item.Value["Msg"];
if (msg != null)
{
txtErrors.Text += msg + Environment.NewLine;
}
}
//отформатировать один
{[UserNotFound, {
"SeverityType": 3,
"ValidationType": 2,
"Msg": "Email Not Found"
}]}
мой код работает.
//format 2 (появился потому, что я не обнаружил исключения на серверах)
{
"Message": "An error has occurred.",
"ExceptionMessage": "Object reference not set to an instance of an object.",
"ExceptionType": "System.NullReferenceException",
"StackTrace": " "
}
Я могу, конечно, исправить это и поймать исключение. Однако, если я когда-нибудь забуду еще раз, я скорее не буду терпеть крах на клиенте. Поэтому я хотел бы просто распечатать "сообщение", но я не понимаю, как это сделать, чтобы он не разбился на var msg = item.Value["Msg"];
Ошибка, которую я получаю, когда пытается сделать var msg = item.Value["Msg"];
System.InvalidOperationException was unhandled
Message=Cannot access child value on Newtonsoft.Json.Linq.JValue.
StackTrace:
at Newtonsoft.Json.Linq.JToken.get_Item(Object key)
at Fitness.WindowsPhone7.UI.MainPage.<btnSignIn_Click>b__0(IRestResponse response)
at RestSharp.RestClientExtensions.<>c__DisplayClass1.<ExecuteAsync>b__0(IRestResponse response, RestRequestAsyncHandle handle)
at RestSharp.RestClient.ProcessResponse(IRestRequest request, HttpResponse httpResponse, RestRequestAsyncHandle asyncHandle, Action`2 callback)
at RestSharp.RestClient.<>c__DisplayClass3.<ExecuteAsync>b__0(HttpResponse r)
at RestSharp.RestClient.<>c__DisplayClass5.<>c__DisplayClass7.<ExecuteAsync>b__2(Object s)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at System.Delegate.DynamicInvokeOne(Object[] args)
at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
at System.Delegate.DynamicInvoke(Object[] args)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)
Ответы
Ответ 1
Предполагая, что вы используете Newtonsoft.Json:
Вы можете использовать JObject для проверки, есть ли свойство или нет:
JObject jObj; //initialized somewhere, perhaps in your foreach
var msgProperty = jObj.Property("msg");
//check if property exists
if (msgProperty != null) {
var mag = msgProperty.Value;
} else {
//there is no "msg" property, compensate somehow.
}
Ответ 2
Вы можете использовать TryGetValue, это своего рода стандартный метод для выполнения именно того, что вам нужно. Я говорю стандарт, потому что методы Try можно найти по всей платформе .NET и обычно имеют одну и ту же подпись метода.
Используя это, вы можете получить такое значение.
JObject json = new JObject();
JToken value;
if (json.TryGetValue("myProperty", out value))
{
string finalValue = (string)value;
}
TryGetValue возвращает логическое значение, указывающее, было ли найдено значение или нет, если значение найдено, значение, переданное как второй параметр, устанавливается в значение свойства. В противном случае устанавливается значение null.
Ответ 3
Или вы можете просто использовать ContainsKey в JsonObject.
Вот пример моего собственного кода с аналогичной проблемой для вас:
foreach (JsonObject feed in data)
{
var fbFeed = new FacebookFeeds();
if (feed.ContainsKey("message"))
fbFeed.Message = (string)feed["message"];
if (feed.ContainsKey("story"))
fbFeed.Message = (string)feed["story"];
if (feed.ContainsKey("picture"))
fbFeed.Message = (string)feed["picture"];
fbFeeds.Add(fbFeed);
}