JsonConvertを使用します。入力文字列が有効なJsonではなく、数値で始まる場合のDeserializeObject
-
21-12-2019 - |
質問
数値で始まる、または数値のみを含むプレーン文字列の逆シリアル化を処理し、現在のように動作しない理由を理解するための優れた解決策を見つ
私は入力文字列を制御することができないので、それらが有効なJsonであることに頼ることはできません、そして現時点では私はそれがJsonであるかど
これは私がそれを逆シリアル化する方法です:
JsonConvert.DeserializeObject<MyClass[]>(myString);
私のクラスには2つのプロパティがあります:
[JsonProperty(PropertyName = "key")]
public string Key { get; set; }
[JsonProperty(PropertyName = "value")]
public string Value { get; set; }
入力文字列が単に"a"または"a2"の場合、Newtonsoftがスローされます。Json...JsonException("値の解析中に予期しない文字が発生しました:a.パス"、行0、位置0。これは予想されますが、"2"と"2a"は他のエラーをスローします。私は"2"と"2a"のために"a"と"a2"と同じ動作をしたいと思います。
"2"を渡すときの例外:
Newtonsoft.Json.JsonSerializationException : Error converting value 2 to type 'MyClass[]'. Path '', line 1, position 1.
System.ArgumentException : Could not cast or convert from System.Int64 to MyClass[].
"2a"を渡すときの例外:
System.FormatException : Input string was not in a correct format.
文字列に数字のみが含まれている場合、または数字で始まる場合に機能しないのはなぜですか?入力文字列を"[{}]"でラップするよりも、これを修正するよりスマートな方法はありますか?
解決
あなたの問題は、JSONパーサーとそれを渡しているものに起因します。
2
は有効な値です。例えば、 JsonConvert.DeserializeObject<int>('2');
しかし、 a2
オブジェクトリテラルの外に存在することができない不完全な識別子またはプロパティと見なす可能性が高いためではありません。囲む引用符がないため、文字列ではありません。
基本的には、jsonパーサーに無効なJSONを解析させようとしていますが、これはもちろん実行されません。
あなたの場合、私は実際にこのようなことをします:
MyClass cls = null;
if (json.StartsWith("{")) {
cls = JsonConvert.DeserializeObject<MyClass>(json);
} else {
cls = new MyClass() {
Key = json
};
}
これはのために点検します {}
どのオブジェクトを開始/終了する必要があります。私達がaを見つければ {
クラスのインスタンスを手動で作成して値を入力しない場合は、オブジェクトであると想定して逆シリアル化することができます。
私はもちろんここでいくつかの仮定をしています。