2017-06-19 55 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': '發生了一個錯誤'}」

相關問題