在没有json.net的情况下反序列化json文本文件

时间:2014-11-04 16:53:08

标签: c# json

我有一些json数据存储在一个文本文件中(数据位于https://github.com/VinceG/Auto-Cars-Makes-And-Models)。我通过json2csharp运行json文件,该文件生成了以下存储类

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

我正在尝试使用以下代码将数据反序列化到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对象中返回null。

字符串builder.ToString()看起来包含所有数据(它显示最终标题的其他Yugo模型是正确的)

我故意不使用json.net,因为它是json我在这个应用程序中唯一的反序列化,所以它有点矫枉过正。

我应该说这不是一个家庭作业项目或类似的东西

2 个答案:

答案 0 :(得分:1)

json字符串表示一个数组,因此您需要将其反序列化为List<VehicleMake>。只需更改以下行:

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

使用:

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

您将获得具有正确初始化值,标题和模型属性的车辆列表。

答案 1 :(得分: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; }
}