2017-10-26 5 views
0

上で動作するようにJSON DeserializeObjectを取得私はJson.Netを使用して、以下のクラスをデシリアライズしようとしているとエラーが発生します:トラブルこのクラス

Error converting value "abc" to type 'System.UInt16'. Path 'typestr'

public class TestClass 
{ 
    [JsonIgnore] 
    public static ushort TEST_TYPE_A = 0; 

    [JsonIgnore] 
    public static ushort TEST_TYPE_B = 1; 

    [JsonProperty("typestr")] 
    public string typestr {get; set;} 

    [JsonProperty("testvalue")] 
    public string testvalue {get; set;} 

    [JsonProperty("bob")] 
    public string bob {get; set;} 

    public TestClass(ushort typestr) 
    { 
     this.typestr = types[typestr]; 
    } 

    public void Init() { } 
} 


TestClass a = JsonConvert.DeserializeObject<TestClass>("{\"typestr\": \"abc\"}"); 

このエラーを回避する方法を誰もが知っていますか?

+3

あなたが提供したコードは、例外をスローしません。少なくとも、Json.NET v10.0.3を使用しているマシンではありません。私の推測では、実際のコードを短くて完全な例にコピーしようとしましたが、それは問題が再現されていることを確認することなく(悪いです)。本物の[mcve]を提供してください。 –

+1

コンストラクタの宣言が更新され、エラーになりました。 – user740521

+0

これは、「typestr」という名前の「ushort」を受け入れるだけでなく、「typestr」という名前の「string」プロパティを持つことから始めるのは非常に紛らわしいものです。おそらくJson.NETはコンストラクタを呼び出そうとしていますが、あなたは 'ushort'の代わりに文字列を与えています。その型の衝突を避けることはできませんか?パラメータの名前を変更するだけでも十分です。 –

答えて

3

JSONには、文字列値を持つtypestrのプロパティを指定しました。 、

  • プロパティ(タイプstring
  • コンストラクタのパラメータ(タイプushort

Json.NETそれらのいずれかを使用することができます。また、あなたのクラスでtypestrと呼ばれる二つの部分を持っています明らかにコンストラクタパラメータが優先されます。これは、他のコンストラクタを提供していないことを前提としています。

次のことが可能です。

  • 変更コンストラクタのパラメータ
  • の名前は、これらのいずれかがトリックを行うようだパラメータなしのコンストラクタ

を提供する - 場合、私は個人的にはパラメータなしのコンストラクタを提供しますJSON値がコンストラクタ呼び出しで使用されることは期待していません。