2016-03-28 6 views
1

Ich mache einige Aufrufe einiger REST-Dienste und Deserialisierung der Ergebnisse, die ich in C# -Objekten bekomme. Alles sieht ziemlich viel von dem Buch, und zum größten Teil alles in Ordnung ist, aber habe ich einen Teil meiner JSON, die die Deserializer abwirft und gibt die nicht sehr hilfreich Fehlermeldung:Newtonsoft.Json schlägt das Deserialisieren von gültigem JSON fehl

unerwartetes Token, wenn Deserialisieren Objekt : Startobjekt. Pfad ‚channels.results 1‘, Zeile 1, Position 636.

Also ging ich und isoliert, dass ein Teil meines Codes und JSON, um zu sehen, ob ich herausfinden konnte, was los war, und zur Zeit habe ich dies: https://dotnetfiddle.net/RWpwtn die nicht auch (Obwohl, wenn es zu einem dynamischen gegossen wird so scheint es, zumindest zum größten Teil zu arbeiten):

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); 
    } 
} 

haben jemand eine Idee, was dies verursachen könnte?

+0

dotnetfiddles kann linkrot so sollten Sie den gesamten Code in Ihre Frage als auch (aber mit allen Mitteln halten Sie den Link auf die Geige) einfügen . – Default

+0

Das werde ich mir für die Zukunft merken – bnm12

Antwort

0

Ich fand den Fehler, ich denke, dieser Beitrag war nur die Motivation, die ich brauchte.

Der Fehler stammt von dem KVPEnumConverter, der zu weit voraus schaut, anstatt zurückzukommen, wenn der Wert Null ist. Alles, was ich tun musste, war eine Null-Kontrolle wie folgt vorstellen:

&& reader.TokenType != JsonToken.Null 
Verwandte Themen