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

使用不同的名称通过Json.Net进行序列化和反序列化

秦鸿羽
2023-03-14
问题内容

我正在从如下所示的Web API接收JSON数据:

[
  {
    "id": 1
    "error_message": "An error has occurred!"
  }
]

我将此数据反序列化为以下类型的对象:

public class ErrorDetails
{
    public int Id { get; set; }

    [JsonProperty("error_message")]
    public string ErrorMessage { get; set; }
}

稍后在我的应用程序中,我想再次将ErrorDetails对象序列化为JSON,但使用属性名称ErrorMessage代替error_message。因此结果将如下所示:

[
  {
    "Id": 1
    "ErrorMessage": "An error has occurred!"
  }
]

有什么简单的方法可以使用Json.Net完成此操作?也许使用自定义解析器和一些属性,例如:

public class ErrorDetails
{
    public int Id { get; set; }

    [SerializeAs("ErrorMessage")]
    [DeserializeAs("error_message")]
    public string ErrorMessage { get; set; }
}

但是解析器不会告诉我何时进行序列化或反序列化。


问题答案:

您可以使用JsonSerializerSettings,ContractResolver和NamingStrategy。

public class ErrorDetails
{
    public int Id { get; set; }
    public string ErrorMessage { get; set; }
}

var json = "{'Id': 1,'error_message': 'An error has occurred!'}";

对于反序列化,您可以使用SnakeCaseNamingStrategy

var dezerializerSettings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new SnakeCaseNamingStrategy()
    }
};
var obj = JsonConvert.DeserializeObject<ErrorDetails>(json, dezerializerSettings);

要再次序列化对象,您不必更改,JsonSerializerSettings因为默认情况下将使用属性名称。

var jsonNew = JsonConvert.SerializeObject(obj);

jsonNew =“ {‘Id’:1,’ErrorMessage’:’发生错误!’}”

或者,您可以创建合同解析器,该解析器可以决定要使用的名称。然后,您可以决定何时要对pascal大小写名称格式或带下划线的格式进行反序列化和序列化。

public class CustomContractResolver : DefaultContractResolver
{
    public bool UseJsonPropertyName { get; }

    public CustomContractResolver(bool useJsonPropertyName)
    {
        UseJsonPropertyName = useJsonPropertyName;
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        if (!UseJsonPropertyName)
            property.PropertyName = property.UnderlyingName;

        return property;
    }
}

public class ErrorDetails
{
    public int Id { get; set; }
    [JsonProperty("error_message")]
    public string ErrorMessage { get; set; }
}


var json = "{'Id': 1,'error_message': 'An error has occurred!'}";
var serializerSettings = new JsonSerializerSettings()
{
    ContractResolver = new CustomContractResolver(false)
};
var dezerializerSettings = new JsonSerializerSettings
{
    ContractResolver = new CustomContractResolver(true)
};

var obj = JsonConvert.DeserializeObject<ErrorDetails>(json, dezerializerSettings);
var jsonNew = JsonConvert.SerializeObject(obj, serializerSettings);

jsonNew =“ {‘Id’:1,’ErrorMessage’:’发生错误!’}”



 类似资料:
  • 问题内容: 我正在从API检索JSON。我正在使用newtonsoft(这是json.net吗?)将其反序列化为对象列表。有用。 不幸的是,我还需要将此作为JSON传递给其他人(只有我有权访问它们,他们才能直接调用API)。不幸的是,我说这是因为我需要输出与接收到的JSON不同的JSON(属性名称必须不同)。 例如,我有一个名为Person的类,具有一个名为Name的属性。我想获取“人物”,因此我

  • 本文向大家介绍C#使用Json.Net进行序列化和反序列化及定制化,包括了C#使用Json.Net进行序列化和反序列化及定制化的使用技巧和注意事项,需要的朋友参考一下 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json

  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 我有一个非常不理想的情况,要求我反序列化JSON,其中值是JSON.NET的字段名称。假设我具有以下结构正确的JSON: 使用JSON.NET将其反序列化为CLR对象非常容易: 但是,在当前情况下,我有以下可怕的JSON,就值而言,它等效于上述JSON: 如您所见,field不是数组。这是一个包含其他值作为对象的对象,其唯一键作为其字段名称(这太可怕了)。使用JSON.NET 将JSO

  • 我试图通过CLI反序列化保存为protobuf的文件(似乎是最容易做到的事情)。我不希望使用protoc进行编译,将其导入编程语言,然后读取结果。 我的用例:一个TensorFlow lite工具以原型格式输出了一些数据。我也在TensorFlow存储库中找到了原型定义。我只想快速阅读输出。具体来说,我正在从工具中获取消息。