2016-03-28 17 views
1

私はいくつかのRESTサービスの呼び出しを行い、結果をデシリアライズしてC#オブジェクトに入れています。すべては本を読んでかなり多くを見て、ほとんどの部分すべてがうまくあるため、しかし私は、デシリアライザをオフにスローし、非常に有用ではないエラーメッセージが表示できます私のJSONの一つのセクションがあります:オブジェクトをデシリアライズするときNewtonsoft.Jsonが有効なJSONのデシリアライズに失敗しました

予期しないトークンを:StartObject。パス「1をchannels.results」、行1、位置

636は、だから私は行って、私が間違っていたかを把握できたかどうかを確認するために私のコードとJSONのその部分を単離し、現在私はこれを持っている:https://dotnetfiddle.net/RWpwtnまた、(それは少なくとも大部分は、動作しているようですダイナミックにキャストしてしまった場合も)その失敗:

using System; 
using Newtonsoft.Json; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     string JSON = "{\"id\" : 19,\"name\" : \"Vidensdeling\",\"sortOrder\" : 0,\"breakRightsInheritance\" : false,\"canContainItems\" : false,\"external\" : false,\"canOnlyEditItsOwn\" : null,\"parentChannelId\" : null,\"inheritedParentChannelId\" : null,\"itemCount\" : 0,\"permissionTarget\" : null,\"permissionTargetType\" : null,\"childChannelIds\" : [],\"contentTypeIds\" : [],\"mandatoryPrincipalIds\" : [],\"suggestedPrincipalIds\" : [],\"readRightsPrincipalIds\" : [],\"writeRightsPrincipalIds\" : [],\"visibleInCurrentView\" : null,\"mandatoryForCurrentUser\" : null,\"suggestedForCurrentUser\" : null,\"personalSelectedForCurrentUser\" : null,\"writeAllowedForCurrentUser\" : null,\"readAllowedForCurrentUser\" : null}"; 
     ChannelDtoV1 obj = JsonConvert.DeserializeObject<ChannelDtoV1>(JSON); 
     Console.WriteLine(obj.Id); 
    } 
} 

public class ChannelDtoV1 
{ 
    //Data properties 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int SortOrder { get; set; } 
    public bool BreakRightsInheritance { get; set; } 
    public bool CanContainItems { get; set; } 
    public bool External { get; set; } 
    public bool? CanOnlyEditItsOwn { get; set; } 
    public int? ParentChannelId { get; set; } 
    public int? InheritedParentChannelId { get; set; } 
    public int ItemCount { get; set; } 
    public string PermissionTarget { get; set; } 
    [JsonConverter(typeof(KVPEnumConverter<PermissionTargetType>))] 
    public PermissionTargetType? PermissionTargetType { get; set; } 

    //Collection properties 
    public ICollection<int> ChildChannelIds { get; set; } 
    public ICollection<int> ContentTypeIds { get; set; } 
    public ICollection<int> MandatoryPrincipalIds { get; set; } 
    public ICollection<int> SuggestedPrincipalIds { get; set; } 
    public ICollection<int> ReadRightsPrincipalIds { get; set; } 
    public ICollection<int> WriteRightsPrincipalIds { get; set; } 

    //Computed properties 
    public bool? VisibleInCurrentView { get; set; } 
    public bool? MandatoryForCurrentUser { get; set; } 
    public bool? SuggestedForCurrentUser { get; set; } 
    public bool? PersonalSelectedForCurrentUser { get; set; } 
    public bool? WriteAllowedForCurrentUser { get; set; } 
    public bool? ReadAllowedForCurrentUser { get; set; } 

    public ChannelDtoV1() 
    { 
     ChildChannelIds = new List<int>(); 
     MandatoryPrincipalIds = new List<int>(); 
     SuggestedPrincipalIds = new List<int>(); 
     ReadRightsPrincipalIds = new List<int>(); 
     WriteRightsPrincipalIds = new List<int>(); 
     ContentTypeIds = new List<int>(); 
    } 
} 

public enum PermissionTargetType 
{ 
    BussinessApp = 1 
} 

public class KVPEnumConverter<T> : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteStartObject(); 
     writer.WritePropertyName("name"); 
     writer.WriteValue(value.ToString()); 
     writer.WritePropertyName("value"); 
     writer.WriteValue((int)value); 
     writer.WriteEndObject(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType is T; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     object rtnObj = null; 
     while (reader.Read() && reader.TokenType != JsonToken.EndObject) 
     { 
      if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "value") 
      { 
       reader.Read(); // proceed to value 
       rtnObj = Enum.Parse(typeof(T), reader.Value.ToString()); 
      } 
     } 
     return rtnObj ?? default(T); 
    } 
} 

誰もがこれを引き起こしている可能性があります何についてどのような考えを持っていますか?

+0

dotnetfiddlesはそうあなたが同様にあなたの質問へのコードのすべてを貼り付けます(ただし、すべての手段によってフィドルへのリンクを維持する)必要がありますlinkrotすることができます。 – Default

+0

私は未来のことを念頭に置いておきます – bnm12

答えて

0

私は間違いを見つけました。この投稿は私が必要とした動機だけだったと思います。

このエラーは、値がnullの場合に返されるのではなく、あまりにも先に見えるKVPEnumConverterから発生します。 は私がしなければならなかったすべては、このようなヌルチェックを導入することでした:

&& reader.TokenType != JsonToken.Null 
関連する問題