C# 不使用json.net反序列化json文本文件

C# 不使用json.net反序列化json文本文件,c#,json,C#,Json,我将一些json数据存储在一个文本文件中(数据位于)。我通过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 titl

我将一些json数据存储在一个文本文件中(数据位于)。我通过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; }
}
公共类模型
{
公共字符串值{get;set;}
公共字符串标题{get;set;}
}
公共级汽车制造商
{
公共字符串值{get;set;}
公共字符串标题{get;set;}
公共列表模型{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;
        }
    }
}
class类main类
{
公共静态void Main(字符串[]args)
{
WriteLine(“让我们反序列化吧!”);
var sb=新的StringBuilder();
使用(var sr=newstreamreader(“models.json”))
{
弦线;
而((line=sr.ReadLine())!=null)
给某人加上一行(一行);
}
var vehicleList=反序列化(sb.ToString());
控制台。写入线(“完成”);
}
私有静态T反序列化(字符串json)
{
T obj=Activator.CreateInstance();
尝试
{
使用(var ms=newmemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer=newdatacontractjsonserializer(obj.GetType());
obj=(T)serializer.ReadObject(ms);
Close女士();
返回obj;
}
}
捕获(例外情况除外)
{
WriteLine(“反序列化中的异常抛出-{0}-{1}”,例如Message,例如StackTrace);
返回obj;
}
}
}
我在许多不同的项目中使用过这种反序列化方法,但它从未引起过问题。尽管它在
vehicleList
对象中返回null,但在这里仍然存在

string builder.ToString()看起来包含了所有的数据(它为最终的标题显示了其他Yugo模型,这是正确的)

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


我应该说,这不是一个家庭作业或类似的项目,您需要向类和成员添加[DataContract]和[DataMember]属性。也可能[可序列化]

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; }
}
使用系统;
使用System.Runtime.Serialization;
[可序列化]
[数据合同]
公共类模型
{
[DataMember(Name=“value”)]
公共字符串值{get;set;}
[DataMember(Name=“title”)]
公共字符串标题{get;set;}
}
[可序列化]
[数据合同]
公共级汽车制造商
{
[DataMember(Name=“value”)]
公共字符串值{get;set;}
[DataMember(Name=“title”)]
公共字符串标题{get;set;}
[DataMember(Name=“models”)]
公共列表模型{get;set;}
}

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

var vehicleList = Deserialize<VehicleMake>(sb.ToString());
var vehicleList=反序列化(sb.ToString());
与:

var vehicleList=反序列化(sb.ToString());

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

不幸的是,目标平台无法访问JavascriptSerialiser类谢谢-它仍然为vehicleList中的所有值返回null,尽管我觉得很愚蠢,因为我没有注意到您正在强制转换为单个车辆Make:)
var vehicleList = Deserialize<List<VehicleMake>>(sb.ToString());