2017-12-13 7 views
4

"$ type"という名前のjsonプロパティ名に問題があるようです。
名前を「$ typ」または「$ typee」に変更すると、動作しているようです。
は、最初に私は目に見えないUnicode文字があると思ったが、これはJon Skeet's Unicode ExplorerにJSONと属性値の両方私は以来、コピー&ペーストの場合ではないようですし、私は

using Newtonsoft.Json; 
using System; 

namespace ConsoleAppCompare 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string json = @"{ 
           ""$type"": ""someText"", 
           ""$someName"": ""MoreText"", 
           ""$ThisWorksToo"": ""en"", 
           ""Counting"": true 
          }"; 

      var movie = JsonConvert.DeserializeObject<Movie>(json); 

      Console.WriteLine("Type:"+ movie.type); //type is null here 
      Console.ReadLine(); 
     } 
    } 

    class Movie 
    { 
     [JsonProperty(PropertyName = "$type")] 
     public string type { get; set; } 

     [JsonProperty(PropertyName = "$someName")] 
     public string Name { get; set; } 

     [JsonProperty(PropertyName = "$ThisWorksToo")] 
     public string Language { get; set; } 

     public bool Counting { get; set; } 
    } 
} 
奇妙なものを見ることができません

誰か説明がありますか? 私はNewtonsoft.Json.10.0.3

を使用してい

更新それは私がそれはNewtonsoft.Jsonに名前を予約して使用され

string json = @"{ 
       ""$someName"": ""MoreText"", 
       ""$ThisWorksToo"": ""en"", 
        ""$type"": ""someText"", 
        ""Counting"": true 
       }"; 
+2

私は決定的なを持っていないが、私は、 '$のtype'がが連載されているクラスの実際の型を格納するために使用newtonsoftで予約名、であると考えている:指定JsonSerializerSettingsによってシリアライズ/デシリアライゼーションのために有効になっています。 https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htmを参照して、タイプのフルネームが$ typeというプロパティにどのように格納されているかを確認します。この競合を起こさずにプロパティ名を使用できるようにnewtonsoftを構成する方法はわかりません。 – Will

+2

これは、このプロパティがクラスのTypeのシリアル化に使用されたためです。 – eocron

+0

heh、おそらく間違っている可能性があります... – Gabriel

答えて

3

他somewherプロパティを移動した場合に動作しているようだ クラスを表すTypeの直列化

new JsonSerializerSettings 
{ 
    TypeNameHandling = TypeNameHandling.All 
} 
+0

'TypeNameHandling.None'を使用すると、jsonのプロパティ名で' '$ type" 'を使用できますか? – Will

+0

@いいえ、それはしません –

関連する問題