如何在没有JSON.NET库的情况下解析JSON?

Eli*_*vah 72 c# json windows-8

我正在尝试在Visual Studio 2011上为Windows 8构建Metro应用程序.虽然我正在尝试这样做,但我遇到了一些关于如何在JSON没有JSON.NET库的情况下解析的问题(它还不支持metro应用程序) .

无论如何,我想解析一下:

{
   "name":"Prince Charming",
   "artist":"Metallica",
   "genre":"Rock and Metal",
   "album":"Reload",
   "album_image":"http:\/\/up203.siz.co.il\/up2\/u2zzzw4mjayz.png",
   "link":"http:\/\/f2h.co.il\/7779182246886"
}
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 95

您可以使用在.NET 4.5中添加的System.Json命名空间中找到的类.您需要添加对System.Runtime.Serialization程序集的引用

JsonValue.Parse()方法解析JSON文本,并返回一个JsonValue:

JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");
Run Code Online (Sandbox Code Playgroud)

如果传递带有JSON对象的字符串,则应该能够将值转换为JsonObject:

using System.Json;


JsonObject result = value as JsonObject;

Console.WriteLine("Name .... {0}", (string)result["name"]);
Console.WriteLine("Artist .. {0}", (string)result["artist"]);
Console.WriteLine("Genre ... {0}", (string)result["genre"]);
Console.WriteLine("Album ... {0}", (string)result["album"]);
Run Code Online (Sandbox Code Playgroud)

这些类与System.Xml.Linq命名空间中的类非常相似.

  • 您需要添加对System.Runtime.Serialization程序集的引用. (19认同)
  • 使用Nuget安装system.json:Install-Package System.Json (8认同)
  • System.Json仍处于测试阶段,因此Nuget包似乎是获得它的方式.它不是最新的完整Framework V 4.5.1内置的.就个人而言,我喜欢Json.Net的API,它比Windows.Data.Json或System.Json更简洁,更快速.见http://james.newtonking.com/json/help/html/JsonNetVsWindowsDataJson.htm (5认同)
  • 如果找不到包,请确保添加版本号.示例:`PM> Install-Package System.Json -Version 4.0.20126.16343`.在这里找到当前版本:http://nuget.org/packages/System.Json (3认同)
  • 找不到system.json (3认同)

cto*_*orx 32

我使用这个......但是从未做过任何Metro应用程序开发,所以我不知道对你可用的库有任何限制.(注意,您需要使用DataContract和DataMember属性标记类)

public static class JSONSerializer<TType> where TType : class
{
    /// <summary>
    /// Serializes an object to JSON
    /// </summary>
    public static string Serialize(TType instance)
    {
        var serializer = new DataContractJsonSerializer(typeof(TType));
        using (var stream = new MemoryStream())
        {
            serializer.WriteObject(stream, instance);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    /// <summary>
    /// DeSerializes an object from JSON
    /// </summary>
    public static TType DeSerialize(string json)
    {
        using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
        {
            var serializer = new DataContractJsonSerializer(typeof(TType));
            return serializer.ReadObject(stream) as TType;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你有这样的课......

[DataContract]
public class MusicInfo
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Artist { get; set; }

    [DataMember]
    public string Genre { get; set; }

    [DataMember]
    public string Album { get; set; }

    [DataMember]
    public string AlbumImage { get; set; }

    [DataMember]
    public string Link { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

那你就像这样用它......

var musicInfo = new MusicInfo
{
     Name = "Prince Charming",
     Artist = "Metallica",
     Genre = "Rock and Metal",
     Album = "Reload",
     AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
     Link = "http://f2h.co.il/7779182246886"
};

// This will produce a JSON String
var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo);

// This will produce a copy of the instance you created earlier
var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用的是框架的v4.5,看起来dtb有一个更新的原生方式(上面回答). (2认同)

tod*_*dmo 7

对于那些没有4.5的人,这是我的库函数,它读取json.它需要项目引用System.Web.Extensions.

using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}
Run Code Online (Sandbox Code Playgroud)

通常,json是根据合同写出来的.该合同可以并且通常将编成一个类(T).有时您可以从json中获取一个单词并搜索对象浏览器以查找该类型.

用法示例:

鉴于json

{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
Run Code Online (Sandbox Code Playgroud)

您可以将其解析为如下RadComboBoxClientState对象:

string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;
Run Code Online (Sandbox Code Playgroud)


Sim*_*ier 7

我需要一个没有任何第三方依赖或 nuget 的 JSON 序列化器和反序列化器,可以支持旧系统,因此您不必根据目标在 Newtonsoft.Json、System.Text.Json、DataContractSerializer、JavaScriptSerializer 等之间进行选择平台。

所以我在这里启动了这个“ ZeroDepJson ”开源(MIT 许可)项目:

https://github.com/smourier/ZeroDepJson

它只是一个 C# 文件 ZeroDepJson.cs,兼容 .NET Framework 4.x 到 .NET Core/5/6/7+。

请注意,绝对性能并不是目标。虽然我希望它的性能不错,但如果您正在寻找有史以来性能最好的 JSON 序列化器/反序列化器,那么就不要使用它。

  • 我喜欢这样的图书馆。可能会将其用于需要从 REST 响应解析 JSON 的 SQL SSIS 包脚本。谢谢!!! (2认同)

YS.*_*YS. 6

你试过用过JavaScriptSerializer吗?还有DataContractJsonSerializer

  • 数据契约:http://msdn.microsoft.com/en-us/library/bb908432.aspx JavaScriptSerializer:http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx (2认同)