【问题标题】:A better way to deserialize JSON?反序列化 JSON 的更好方法?
【发布时间】:2013-08-09 19:15:37
【问题描述】:

我发布到可能返回以下 2 种 JSON 字符串格式之一的 API:

{
"MessageType": 6,
"Message": "Unable to SAVE new record. Invalid posted data."
}

{
"Model": {
    "Id": "1-6Q0RZ9",
    ...

         },   
"ResponseResult": {
    "MessageType": 10,
    "Message": "Successfully saved, Record Id = 1-6Q0RZ9"
                  }
}

我需要从 MessageType 检索结果并尝试了我能想到的每个 if 条件来读取结果,因为每个 JSON 字符串的语法或检索 key:value 都不同,并且没有其他标志可以触发非此即彼。所以我使用的代码是:

string result = eml.PostData("API/Save", dataJSON.ToString());
var returnresult = new JavaScriptSerializer().Deserialize<dynamic>(result);
try {
  var responseresults = returnresult["ResponseResult"];
  rr = responseresults["MessageType"];
  rrtxt = responseresults["Message"];
} catch (Exception ex) {
  rr = returnresult["MessageType"];
  rrtxt = returnresult["Message"];
}

效果很好。如果存在有效的 Db 帖子,则返回由 TRY 语句正确解析的第二个 JSON,如果没有,则抛出“未找到密钥”错误并在 CATCH 语句中解析返回的字符串(第一个 JSON 示例)。显然这是可怕的代码,但我想不出另一种方法来做到这一点,我想知道是否有人有建议? (请?)

提前感谢。

【问题讨论】:

  • 我强烈推荐Json.NET
  • 我在使用 JSON.Net 时遇到了类似的问题,在我的情况下,没有办法知道你会得到哪个字符串。
  • 虽然 JSON.Net 也会有同样的问题,但它的性能要比您使用的 JSON 解析器好得多。
  • 我很欣赏这个建议,但我仍然需要解决问题......
  • @RickBailly 下面的解决方案不适合您吗?

标签: c# asp.net json


【解决方案1】:

如何反序列化对具有每个返回类型的所有属性的对象的响应,然后只检查值?

public class ReturnObject
{
     public YourModel Model {get;set;}
     public ResultObject ResponseResult {get;set;}
     public int? MessageType {get;set;}
     public string Message {get;set;}
}


string result = eml.PostData("API/Save", dataJSON.ToString());
var returnresult = new JavaScriptSerializer().Deserialize<ReturnObject>(result);
{
  if(returnresult.MessageType.HasValue)
  {
     var messageType = returnResult.MessageType.Value;
     etc etc.
  }

} 

【讨论】:

  • 感谢您的帮助。我不太确定 public YourModel Model {get;set;} 或 ResultObject ResponseResult 应该引用什么。有了它们,我得到的类型或命名空间没有找到,没有它们,我得到的 MessageType 为 0(API 只返回 1 到 17 的结果)。请原谅我的无知,请指教。
  • 您还需要了解它们的数据结构并为它们创建类。
  • 忘了说我最初将返回整数设置为零,所以 if 语句显然不返回 true
  • 在进一步测试中,如果 if 语句返回第二个 JSON 字符串,它似乎甚至没有命中我设置的断点,但 API 日志显示提交成功。它目前在返回第一个 json 字符串时有效。
  • 另一种解决方案是让你的消息类型是一个枚举类型,第一个枚举成员是None,你可以通过说if(returnresult.MessageType != MessageType.None)等来检查消息类型。一个不存在的枚举成员将被序列化为 zero 值。通常是第一个成员或您的枚举。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多