我正在尝试将我的网站从基于 XML 的配置文件移动到基于 JSON 的配置文件。有没有办法加载一个.json
文件以便它变成对象?我一直在网上搜索,但找不到。我已经将.xml
文件转换并保存为.json
. 我宁愿不使用 3rd 方库。
6 回答
您确实应该使用已建立的库,例如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);
}
将 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 客户端
正如另一个答案中提到的,我建议使用 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# 类型定义完全匹配,那么它就可以工作。
使用 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# 中解析示例字符串对您很有帮助
我已经这样做了:
using (StreamReader sr = File.OpenText(jsonFilePath))
{
var myObject = JsonConvert.DeserializeObject<List<YourObject>>(sr.ReadToEnd());
}
此外,您可以使用异步调用来执行此操作,例如:sr.ReadToEndAsync()。使用 Newtonsoft.Json 作为参考。
希望这可以帮助。
JavaScriptSerializer 类由异步通信层在内部用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。您无法访问该序列化程序的实例。但是,此类公开了一个公共 API。因此,当您想在托管代码中使用 JavaScript 对象表示法 (JSON) 时,可以使用该类。
命名空间:System.Web.Script.Serialization
程序集:System.Web.Extensions(在 System.Web.Extensions.dll 中)