2017-06-19 62 views
1
反序列化

我从一个Web API,它看起来像这样接收JSON数据:使用不同的名称和序列化与Json.Net

[ 
    { 
    "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; } 
} 

但是,解析器不告诉我什么时候序列化或反序列化。

+0

你需要两班。每个类都是json生成或读取的合约 –

+0

您可以在反序列化该JSON的同时使用['SnakeCaseNamingStrategy'](http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_SnakeCaseNamingStrategy.htm)。有关如何执行此操作的示例,请参阅[这里](https://stackoverflow.com/a/39090062/3744182)。 – dbc

+0

这似乎很有趣。添加此作为答案请。 – Aetherix

回答

1

您可以使用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!'}"; 

对于dezerialization,您可以使用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案例名称格式或带下划线的格式,则可以决定何时进行dezerialize和序列化。

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': '发生了一个错误'}”

相关问题