49

我正在尝试将我的网站从基于 XML 的配置文件移动到基​​于 JSON 的配置文件。有没有办法加载一个.json文件以便它变成对象?我一直在网上搜索,但找不到。我已经将.xml文件转换并保存为.json. 我宁愿不使用 3rd 方库。

4

6 回答 6

85

确实应该使用已建立的库,例如Newtonsoft.Json(甚至 Microsoft 都将其用于 MVC 和 WebAPI 等框架)或 .NET 的内置JavascriptSerializer

下面是使用 Newtonsoft.Json 读取 JSON 的示例:

JObject o1 = JObject.Parse(File.ReadAllText(@"c:\videogames.json"));

// read JSON directly from a file
using (StreamReader file = File.OpenText(@"c:\videogames.json"))
using (JsonTextReader reader = new JsonTextReader(file))
{
  JObject o2 = (JObject) JToken.ReadFrom(reader);
}
于 2013-08-30T17:31:31.287 回答
12

将 json 序列化为 c# 的另一种好方法如下:

RootObject ro = new RootObject();
     try
    {

        StreamReader sr = new StreamReader(FileLoc);
        string jsonString = sr.ReadToEnd();
        JavaScriptSerializer ser = new JavaScriptSerializer();
        ro = ser.Deserialize<RootObject>(jsonString);


   }

您需要在 .net 4.0 中添加对 system.web.extensions 的引用,这是在程序文件(x86)> 参考程序集> 框架> system.web.extensions.dll 中,您需要确保您使用的是常规 4.0框架不是 4.0 客户端

于 2013-12-16T15:53:14.440 回答
9

正如另一个答案中提到的,我建议使用 json.NET。您可以使用 NuGet 下载包。然后要将您的 json 文件反序列化为 C# 对象,您可以执行以下操作;

   JsonSerializer serializer = new JsonSerializer();
   MyObject obj = serializer.Deserialize<MyObject>(File.ReadAllText(@".\path\to\json\config\file.json");

上面的代码假设你有类似的东西

public class MyObject
{
    public string prop1 { get; set; };
    public string prop2 { get; set; };
}

你的 json 看起来像;

{
      "prop1":"value1",
      "prop2":"value2"
}

我更喜欢使用通用的反序列化方法,该方法会将 json 反序列化为一个对象,假设您为它提供的类型与 json 的定义匹配。如果两者之间存在差异,它可能会抛出,或者不设置值,或者只是忽略 json 中的内容,这取决于问题所在。如果 json 定义与 C# 类型定义完全匹配,那么它就可以工作。

于 2013-08-30T17:36:55.677 回答
4

使用 Server.MapPath 获取 JSON 文件的实际路径并使用 StreamReader 加载和读取文件

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class RootObject
{
    public string url_short { get; set; }
    public string url_long { get; set; }
    public int type { get; set; }
}

public class Program
{
    static public void Main()
    {
       using (StreamReader r = new StreamReader(Server.MapPath("~/test.json")))
       {
           string json = r.ReadToEnd();
           List<RootObject> ro = JsonConvert.DeserializeObject<List<RootObject>>(json);
       }

    Console.WriteLine(ro[0].url_short);                 
    }  
}

注意:请看下面的链接,我也回答了与此类似的问题。 如何在 C# 中解析示例字符串对您很有帮助

于 2016-07-28T12:45:43.480 回答
3

我已经这样做了:

            using (StreamReader sr = File.OpenText(jsonFilePath))
            {
                var myObject = JsonConvert.DeserializeObject<List<YourObject>>(sr.ReadToEnd());
            }

此外,您可以使用异步调用来执行此操作,例如:sr.ReadToEndAsync()。使用 Newtonsoft.Json 作为参考。

希望这可以帮助。

于 2020-04-16T02:18:21.023 回答
1

参见微软的 JavaScriptSerializer

JavaScriptSerializer 类由异步通信层在内部用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。您无法访问该序列化程序的实例。但是,此类公开了一个公共 API。因此,当您想在托管代码中使用 JavaScript 对象表示法 (JSON) 时,可以使用该类。

命名空间:System.Web.Script.Serialization

程序集:System.Web.Extensions(在 System.Web.Extensions.dll 中)

于 2013-08-30T17:36:15.850 回答