2017-01-30 11 views
1

私は奇妙な状況があります。他のクラスは正しくデシリアライズしていますが、3つのint値を持つこの1つのクラスは正しくデシリアライズしません。トレースライターの設定を使用すると、メンバーを見つけることができないとJson.Netが報告しているのがわかりますが、理由はわかりません。JsonConvert DeserializeObjectがintメンバーを見つけることができません

クラス:

public class BroadcastMemoryResponse : BaseResponse 
{ 
    public int FreeMemory { get; set; } 

    [JsonProperty("Malloc_Count")] 
    public int MallocCount { get; set; } 

    [JsonProperty("Free_Count")] 
    public int FreeCount { get; set; } 
} 

JSON:IDServiceStatusフィールドがBaseResponseクラスであり、これらが正常に直列化復元することを

{ 
    "ID": 100, 
    "Service": "BroadcastMemory", 
    "FreeMemory: ": 50508, 
    "Malloc_Count: ": 10050409, 
    "Free_Count: ": 10049533, 
    "Status": "Success" 
} 

注(IDはint型であり、それが適切にデシリアライズ) 。私はJsonPropertiesを使用して、JSONのアンダースコアをC#にマップするときにアンダースコアを削除します。クラスとプロパティはすべてpublicでgetter/setterはpublicなので、問題の内容はわかりません..

テストのデシリアライゼーションコード:

ITraceWriter traceWriter = new MemoryTraceWriter(); 
var settings = new JsonSerializerSettings { TraceWriter = traceWriter }; 
string str = "{\"ID\":100,\"Service\":\"BroadcastMemory\",\"FreeMemory: \":50508,\"Malloc_Count: \":10050409,\"Free_Count: \":10049533,\"Status\":\"Success\"}"; 
var deserializedObj = JsonConvert.DeserializeObject<BroadcastMemoryResponse>(str, settings); 

トレースライターの出力は:

2017-01-30T09:49:46.807 Info Started deserializing TcpClient.Core.Model.BroadcastMemoryResponse. Path 'ID', line 1, position 6. 
2017-01-30T09:49:46.836 Verbose Could not find member 'FreeMemory: ' on TcpClient.Core.Model.BroadcastMemoryResponse. Path '['FreeMemory: ']', line 1, position 51. 
2017-01-30T09:49:46.838 Verbose Could not find member 'Malloc_Count: ' on TcpClient.Core.Model.BroadcastMemoryResponse. Path '['Malloc_Count: ']', line 1, position 74. 
2017-01-30T09:49:46.838 Verbose Could not find member 'Free_Count: ' on TcpClient.Core.Model.BroadcastMemoryResponse. Path '['Free_Count: ']', line 1, position 98. 
2017-01-30T09:49:46.840 Info Finished deserializing TcpClient.Core.Model.BroadcastMemoryResponse. Path '', line 1, position 126. 
2017-01-30T09:49:46.841 Verbose Deserialized JSON: 
{ 
    "ID": 100, 
    "Service": "BroadcastMemory", 
    "FreeMemory: ": 50508, 
    "Malloc_Count: ": 10050409, 
    "Free_Count: ": 10049533, 
    "Status": "Success" 
} 

答えて

3

問題は、あなたのJSONに、あなたがプロパティ名を、(例えば"FreeMemory: "代わり"FreeMemory"の)不正な形式していることです。このライン:

"{ … \"FreeMemory: \":50508,\"Malloc_Count: \":10050409,\"Free_Count: \":10049533, … }" 

は次のようになります。

また
"{ … \"FreeMemory\":50508,\"Malloc_Count\":10050409,\"Free_Count\":10049533, … }" 

、あなたが実際にメッセージを制御できていない場合、あなたは、単にJsonProperty属性を変更することができます

[JsonProperty("FreeMemory: ")] 
public int FreeMemory { get; set; } 

[JsonProperty("Malloc_Count: ")] 
public int MallocCount { get; set; } 

[JsonProperty("Free_Count: ")] 
public int FreeCount { get; set; } 
+0

うわー、どうもありがとうございました。私はこれを見て年を過ごし、それを見ませんでした!私は受け取っているメッセージを制御できないので、サーバのバグでなければならない。この悪いJSONにマッチする 'JsonProperty'属性を追加することで、この問題が解決されました。 – SimonM

+0

@SimonM喜んで私は助けることができました。元の開発者にコードの誤ったタイプミスを修正することを推奨しますが、それがオプションではない場合は、コード内の属性を変更するだけで済みます。私は完全性のために私の答えを更新しました。 –

関連する問題