2016-10-26 6 views
0

PHPの社内Web開発者の1人が書いたAPIを使用しています。私はJSONをデシリアライズするためにJSON.netを使ってC#でアプリケーションを書いています。このAPIは、データベースから顧客情報を取得するために使用されます。ユーザーが返されたJSONを存在する場合変換エラーのあるJSON.NETでJSONを逆シリアル化する方法

{ 
    "success": true, 
    "id": "21", 
    "msg": "", 
    "info": {  
    "FirstName": "name", 
    "LastName": "name",   
    } 
} 

であり、これはこれは完全に正常に動作します。この

public class Json 
{   
    public bool Success { get; set; }   
    public object Id { get; set; }   
    public string Msg { get; set; } 
    public Info Info { get; set; }   
} 

public class Info 
{  
    public string FirstName { get; set; } 
    public string LastName { get; set; }   
} 

のようにクラスにデシリアライズされます。ユーザーが存在しない場合

は、そうでなければ、私は、私はこれをデシリアライズしようとした場合、私は

{"Error converting value False to type 'Info'. Path 'info', line 1, position 79."} 

を取得し、この

{ 
    "success": false, 
    "id": false, 
    "msg": "User does not exists in databse", 
    "info": false 
} 

を受け取るにデシリアライズするために、第2のJSON型を取得するためにとにかくありこのエラーのない同じクラスか、別のjsonの新しいクラスを作成する必要があります。

+1

ブール値ORを返すことは、疑わしいAPI設計です。おそらく、 'false'ではなく' null'を返すべきです。 – Rob

答えて

0

Robのコメントは正しくありません。これは、APIデザインが不良であり、infoは何も存在しなければnullを返します。

これがあなたのコントロール外にある場合は、しかし、あなたはinfoの種類がboolあるかどうかを確認してnullを返し、しかし通常通りデシリアライズするカスタムJsonConverterを使用することができます。

[JsonConverter(typeof(InfoConverter))] 
public Info Info 
{ 
    get; 
    set; 
} 

これは、あなたがdeserialiseたときに、自動的にコンバータを実行する入力のタイプがブールの場合はチェックします:ちょうどあなたのInfoプロパティにJsonConverter属性を追加し、コンバータを起動するために

public class InfoConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return reader.TokenType == JsonToken.Boolean ? null : serializer.Deserialize(reader, objectType); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 
} 

存在する場合はnullを返し、そうでない場合は逆シリアル化します。

これは、infoで受信されたブールがユーザーが存在しないことを意味します。これが当てはまらない場合は、ReadJsonメソッドを適宜更新してください。

0

私は現在、コンパイラを持っていないので、私はそれを確認することはできませんが、多分あなたはInfoに暗黙の型変換演算子を追加することができます。

public class Info 
{  
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public static implicit operator Info(bool b) 
    { 
     return null; 
    } 
} 

しかし、それが動作する場合でも、それは超えただろうハッキー。

関連する問題