2017-01-26 6 views
2

Ich habe die folgenden JSON-Daten als StringJsonConvert.DeserializeObject Fehler bei der Konvertierung von JSON-String C#

string data = "{\"STARTTIME\":\"12:00\",\"ENGINNEERSIGNATURE\":\"Engineer Signature .jpg\",\"OVERNIGHTS\":\"1\",\"SIGNOUT\":\"Yes\"}" 
var dataOut = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); 

Ich muß es ein Wörterbuch Objekt konvertieren, aber ich bekomme die folgende Fehlermeldung beim Versuch

Newtonsoft.Json.JsonSerializationException: Error converting value "{"STARTTIME":"12:00","ENGINNEERSIGNATURE":"Engineer Signature .jpg","OVERNIGHTS":"1","SIGNOUT":"Yes"}" to type 'System.Collections.Generic.Dictionary`2[System.String,System.String]'. Path '', line 1, position 119. ---> System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.Dictionary`2[System.String,System.String]. 
    at Newtonsoft.Json.Utilities.ConvertUtils.EnsureTypeAssignable (System.Object value, System.Type initialType, System.Type targetType) [0x00062] in <2781d1b198634655944cdefb18b3309b>:0 
    at Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast (System.Object initialValue, System.Globalization.CultureInfo culture, System.Type targetType) [0x00031] in <2781d1b198634655944cdefb18b3309b>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType (Newtonsoft.Json.JsonReader reader, System.Object value, System.Globalization.CultureInfo culture, Newtonsoft.Json.Serialization.JsonContract contract, System.Type targetType) [0x0008d] in <2781d1b198634655944cdefb18b3309b>:0 
    --- End of inner exception stack trace --- 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType (Newtonsoft.Json.JsonReader reader, System.Object value, System.Globalization.CultureInfo culture, Newtonsoft.Json.Serialization.JsonContract contract, System.Type targetType) [0x000bd] in <2781d1b198634655944cdefb18b3309b>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x000d7] in <2781d1b198634655944cdefb18b3309b>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent) [0x0007a] in <2781d1b198634655944cdefb18b3309b>:0 

Wo gehe ich falsch

+0

Ihre Fehler auch hinzufügen – Thili77

+0

http://stackoverflow.com/help/how-to-ask „Suchen und Forschung ... und zu verfolgen, was Sie finden. Selbst wenn Sie dies nicht tun Sie finden eine nützliche Antwort an anderer Stelle auf der Website, einschließlich Links zu verwandten Fragen, die nicht geholfen haben, anderen zu helfen, zu verstehen, wie sich Ihre Frage von den anderen unterscheidet. " "Fügen Sie alle Fehlermeldungen ein" "Wenn es möglich ist, ein Live-Beispiel des Problems zu erstellen, das Sie verknüpfen können" – AndyJ

+0

Fehlermeldung hinzugefügt :) –

Antwort

0

Versuchen Sie Dictionary<string,object> zu verwenden, dies ermöglicht den Wert von JSON eines beliebigen Objekttyps. Dictionary<string,string> funktioniert nur, wenn alle Werte des JSON-Objekts vom Typ string sind. Wenn jedoch ein anderer Wert wie ein Array oder ein verschachteltes JSON-Objekt vorhanden ist, wird ein Fehler auftreten.

0

Kann nicht sicher sagen, was dort falsch ist, aber können Sie mir sagen, was dieses kleine Programm auf den ersten beiden Zeilen in der Konsole, auf der gleichen Maschine mit Ihrem Beispielcode ausgeführt, kann ich zwei mögliche Probleme Newtonsoft-Version entweder mit Ihnen erkennen lokale Kultur

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Reflection; 
using System.Threading; 
using Newtonsoft.Json; 

namespace test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Your culture 
      Console.WriteLine("Your Culture:" + Thread.CurrentThread.CurrentCulture.Name); 
      //your JsonConvert Assembly version 
      Console.WriteLine("JsonConvert Assembly" + JsonConvertVersion()); 
      //I guess you have welsh culture, by your nickname 
      //Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("cy-GB"); 
      var stringified = "{\"STARTTIME\":\"12:00\",\"ENGINNEERSIGNATURE\":\"Engineer Signature .jpg\",\"OVERNIGHTS\":\"1\",\"SIGNOUT\":\"Yes\"}"; 
      Console.WriteLine(stringified); 
      //Invariant culture witch shoudn't fail 
      var settings = new JsonSerializerSettings() { Culture = System.Globalization.CultureInfo.InvariantCulture }; 
      var dataOut = JsonConvert.DeserializeObject<Dictionary<string, string>>(stringified, settings); 
      //welsh culture, case I think that is what you are using, but for me is working 
      var settings2 = new JsonSerializerSettings() { Culture = new System.Globalization.CultureInfo("cy-GB", false) };//Welsh 
      var dataOut2 = JsonConvert.DeserializeObject<Dictionary<string, string>>(stringified, settings2); 
      //object with invariant culture 
      Console.WriteLine(dataOut); 
      //object with welsh culture 
      Console.WriteLine(dataOut2); 
      Console.WriteLine(JsonConvert.SerializeObject(dataOut)); 
      Console.WriteLine(JsonConvert.SerializeObject(dataOut2)); 

     } 
     public static string JsonConvertVersion() 
     { 
      Assembly asm = Assembly.GetAssembly(typeof(JsonConvert)); 
      FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location); 
      return String.Format("{0}.{1}", fvi.FileMajorPart, fvi.FileMinorPart); 

     } 
    } 
} 
Verwandte Themen