当前位置: 首页 > 面试题库 >

以“ TryParse”方式反序列化json

龙令
2023-03-14
问题内容

当我向服务(我不拥有)发送请求时,它可能会以请求的JSON数据或看起来像这样的错误进行响应:

{
    "error": {
        "status": "error message",
        "code": "999"
    }
}

在这两种情况下,HTTP响应代码均为200 OK,因此我不能用它来确定是否存在错误-我必须反序列化响应以进行检查。所以我有这样的东西:

bool TryParseResponseToError(string jsonResponse, out Error error)
{
    // Check expected error keywords presence
    // before try clause to avoid catch performance drawbacks
    if (jsonResponse.Contains("error") &&
        jsonResponse.Contains("status") &&
        jsonResponse.Contains("code"))
    {
        try
        {
            error = new JsonSerializer<Error>().DeserializeFromString(jsonResponse);
            return true;
        }
        catch
        {
            // The JSON response seemed to be an error, but failed to deserialize.
            // Or, it may be a successful JSON response: do nothing.
        }
    }

    error = null;
    return false;
}

在这里,我有一个空的catch子句,该子句可能在标准执行路径中,这是一种难闻的气味……嗯,不仅仅是难闻的气味:它发臭。

您是否知道 “ TryParse” 响应的更好方法,以 避免 在标准执行路径中出现问题?

[编辑]

感谢Yuval Itzchakov的回答,我改进了这样的方法:

bool TryParseResponse(string jsonResponse, out Error error)
{
    // Check expected error keywords presence :
    if (!jsonResponse.Contains("error") ||
        !jsonResponse.Contains("status") ||
        !jsonResponse.Contains("code"))
    {
        error = null;
        return false;
    }

    // Check json schema :
    const string errorJsonSchema =
        @"{
              'type': 'object',
              'properties': {
                  'error': {'type':'object'},
                  'status': {'type': 'string'},
                  'code': {'type': 'string'}
              },
              'additionalProperties': false
          }";
    JsonSchema schema = JsonSchema.Parse(errorJsonSchema);
    JObject jsonObject = JObject.Parse(jsonResponse);
    if (!jsonObject.IsValid(schema))
    {
        error = null;
        return false;
    }

    // Try to deserialize :
    try
    {
        error = new JsonSerializer<Error>.DeserializeFromString(jsonResponse);
        return true;
    }
    catch
    {
        // The JSON response seemed to be an error, but failed to deserialize.
        // This case should not occur...
        error = null;
        return false;
    }
}

我保留了catch子句…以防万一。


问题答案:

有了Json.NET您,您可以针对架构验证json:

 string schemaJson = @"{
 'status': {'type': 'string'},
 'error': {'type': 'string'},
 'code': {'type': 'string'}
}";

JsonSchema schema = JsonSchema.Parse(schemaJson);

JObject jobj = JObject.Parse(yourJsonHere);
if (jobj.IsValid(schema))
{
    // Do stuff
}

然后在TryParse方法中使用它。

public static T TryParseJson<T>(this string json, string schema) where T : new()
{
    JsonSchema parsedSchema = JsonSchema.Parse(schema);
    JObject jObject = JObject.Parse(json);

    return jObject.IsValid(parsedSchema) ? 
        JsonConvert.DeserializeObject<T>(json) : default(T);
}

然后做:

var myType = myJsonString.TryParseJson<AwsomeType>(schema);

更新:

请注意,架构验证不再是Newtonsoft.Json主程序包的一部分,您需要添加Newtonsoft.Json.Schema程序包。

更新2:

如评论中所述,“ JSONSchema”具有定价模型,这意味着 它不是免费的
。您可以在这里找到所有信息



 类似资料:
  • 本文向大家介绍.NET中JSON的序列化和反序列化的几种方式,包括了.NET中JSON的序列化和反序列化的几种方式的使用技巧和注意事项,需要的朋友参考一下 一、什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立 于编程语言的文本格式来存

  • 本文向大家介绍C#中实现Json序列化与反序列化的几种方式,包括了C#中实现Json序列化与反序列化的几种方式的使用技巧和注意事项,需要的朋友参考一下 什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write

  • 我有一个这样的JSON: 所有类型都可以包含可变时间,或者只能有一种类型只有一次。 在SpringBoot应用程序中,我有三个类,扩展了公共类。 我有两种方法来序列化和反序列化它。 虽然测试序列化是可以的,但是反序列化在默认情况下不起作用。所以我修改了<code>CommonObject</code>如下: 现在,反序列化工作正常,但序列化不行。json值中包含属性< code>type两次。 有

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 本文向大家介绍详解PHP序列化反序列化的方法,包括了详解PHP序列化反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,其实就是一个序列化的过程,在需要用到这些数据库的时候会进行一个反序列化过程,就是将这个字符串再还原成他原来的数据结构。下面说说php 如何进行数据的序列化和反序列化的。 php 将数据序列化和反序列化其实就用到两

  • 本文向大家介绍ASPNET中JSON的序列化和反序列化的方法,包括了ASPNET中JSON的序列化和反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 一、JSON简介  JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'