2014-11-04 6 views
0

У меня есть некоторые данные json, хранящиеся в текстовом файле (данные находятся в https://github.com/VinceG/Auto-Cars-Makes-And-Models). Я запустите файл JSON через json2csharp породившее следующие классы для храненияDeserialising текстовый файл json без json.net

public class Model 
{ 
    public string value { get; set; } 

    public string title { get; set; } 
} 

public class VehicleMake 
{ 
    public string value { get; set; } 

    public string title { get; set; } 

    public List<Model> models { get; set; } 
} 

Я пытаюсь deserialise данных в класс VehicleMake, используя следующий код

class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine("Let's deserialise!"); 
     var sb = new StringBuilder(); 
     using (var sr = new StreamReader("models.json")) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
       sb.AppendLine(line); 
     } 
     var vehicleList = Deserialize<VehicleMake>(sb.ToString()); 
     Console.WriteLine("Done"); 
    } 

    private static T Deserialize<T>(string json) 
    { 
     T obj = Activator.CreateInstance<T>(); 
     try 
     { 
      using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
      { 
       var serializer = new DataContractJsonSerializer(obj.GetType()); 
       obj = (T)serializer.ReadObject(ms); 
       ms.Close(); 
       return obj; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception throw in Deserialize - {0}-{1}", ex.Message, ex.StackTrace); 
      return obj; 
     } 
    } 
} 

Я использовал этот метод десериализации в ряде различных проектов и никогда не вызывал проблемы. Здесь, хотя он возвращает null в объект vehicleList.

Строка builder.ToString() выглядит, чтобы содержать все данные (он показывает Другие модели Yugo для окончательного названия, которое является правильным)

Я намеренно не используя json.net, как это только десериализация json, которую я делаю в этом приложении, и поэтому она несколько завышена.

я должен сказать, что это не домашнее задание проекта или что-нибудь подобное

+0

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx –

+0

К сожалению, целевая платформа не имеет доступа к JavascriptSerialiser класс – Nodoid

ответ

1

Строка JSON представляет собой массив, так что вам нужно десериализации его в List<VehicleMake>. Просто измените следующую строку:

var vehicleList = Deserialize<VehicleMake>(sb.ToString()); 

с:

var vehicleList = Deserialize<List<VehicleMake>>(sb.ToString()); 

Вы получите список автомобилей с правильно инициализированы значение, название и модели свойств.

+0

Отлично, спасибо :) – Nodoid

0

Вы должны добавить [DataContract] и [DataMember] атрибуты для вашего класса и членов. Возможно также [Serializable]

using System; 
using System.Runtime.Serialization; 

[Serializable] 
[DataContract] 
public class Model 
{ 
    [DataMember(Name = "value")] 
    public string value { get; set; } 

    [DataMember(Name = "title")]  
    public string title { get; set; } 
} 

[Serializable] 
[DataContract] 
public class VehicleMake 
{ 
    [DataMember(Name = "value")] 
    public string value { get; set; } 

    [DataMember(Name = "title")] 
    public string title { get; set; } 

    [DataMember(Name = "models")] 
    public List<Model> models { get; set; } 
} 
+0

Спасибо - он все еще возвращает нуль для всех значений в списке транспортных средств, хотя – Nodoid

+0

Я чувствую себя глупо, потому что не замечаю, что вы сейчас бросали в один VehicleMake :) –

Смежные вопросы