私は奇妙な状況があります。他のクラスは正しくデシリアライズしていますが、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:ID
、Service
とStatus
フィールドが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"
}
うわー、どうもありがとうございました。私はこれを見て年を過ごし、それを見ませんでした!私は受け取っているメッセージを制御できないので、サーバのバグでなければならない。この悪いJSONにマッチする 'JsonProperty'属性を追加することで、この問題が解決されました。 – SimonM
@SimonM喜んで私は助けることができました。元の開発者にコードの誤ったタイプミスを修正することを推奨しますが、それがオプションではない場合は、コード内の属性を変更するだけで済みます。私は完全性のために私の答えを更新しました。 –