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

时间:2012-03-05 19:59:59

标签: 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"
}

8 个答案:

答案 0 :(得分:88)

您可以使用在.NET 4.5中添加的System.Json Namespace中找到的类。您需要添加对System.Runtime.Serialization程序集

的引用

JsonValue.Parse() Method解析JSON文本并返回JsonValue

JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");

如果传递带有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"]);

这些类与System.Xml.Linq Namespace中的类非常相似。

答案 1 :(得分:29)

我使用此...但从未进行任何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;
        }
    }
}

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

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

}

然后你会像这样使用它......

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

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

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

使用示例:

鉴于json

{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}

您可以将其解析为RadComboBoxClientState这样的对象:

string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;

答案 3 :(得分:6)

您是否尝试过使用JavaScriptSerializer? 还有DataContractJsonSerializer

答案 4 :(得分:1)

您可以使用DataContractJsonSerializer。有关详细信息,请参阅此link

答案 5 :(得分:1)

我需要一个 JSON 序列化器和反序列化器,没有任何 3rd 方依赖项或 nuget,可以支持旧系统,因此您不必在 Newtonsoft.Json、System.Text.Json、DataContractSerializer、JavaScriptSerializer 等之间进行选择,具体取决于在目标平台上。

所以我在这里启动了这个开源 (MIT) 项目:

https://github.com/smourier/ZeroDepJson

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

请注意,它可能不如上述所有库(尤其是在性能方面)好,但它应该还算可以且无摩擦。

答案 6 :(得分:0)

我发布了一个名为Tiferix.Json的.NET库,它允许您对ADO.Net DataSet和DataTable对象进行序列化和反序列化Json文件。这个项目正在进行中,在接下来的6个月内(希望如此)我将扩展功能,以允许序列化各种类型的.Net类和对象,包括动态类和匿名类型。截至目前,Tiferix.Json库没有原始的JsonDataReader,但它有一个相当强大的JsonDataWriter类,它可以用.NET Binary或StreamWriter的相同类型的方式编写Json文件。 Tiferix.Json库的JsonDataWriter也能够自动识别你的Json文件,这是我在任何其他Json库中都没有见过的非常有用的功能,包括Json.Net。

如果您有兴趣,可以在我的Github页面上查看Tiferix.Json项目并下载库和dll。 Tiferix.Json为更全面的Json.Net库提供了一种更简单,轻量级的替代方案,并且与原生的.Net Json类相比,它的刚性也更低(在我看来)更容易使用。

Tiferix Json Library

答案 7 :(得分:0)

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace OTL
{
    /// <summary>
    /// Before usage: Define your class, sample:
    /// [DataContract]
    ///public class MusicInfo
    ///{
    ///   [DataMember(Name="music_name")]
    ///   public string Name { get; set; }
    ///   [DataMember]
    ///   public string Artist{get; set;}
    ///}
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class OTLJSON<T> where T : class
    {
        /// <summary>
        /// Serializes an object to JSON
        /// Usage: string serialized = OTLJSON&lt;MusicInfo&gt;.Serialize(musicInfo);
        /// </summary>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static string Serialize(T instance)
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, instance);
                return Encoding.Default.GetString(stream.ToArray());
            }
        }

        /// <summary>
        /// DeSerializes an object from JSON
        /// Usage:  MusicInfo deserialized = OTLJSON&lt;MusicInfo&gt;.Deserialize(json);
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static T Deserialize(string json)
        {
            if (string.IsNullOrEmpty(json))
                throw new Exception("Json can't empty");
            else
                try
                {
                    using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
                    {

                        var serializer = new DataContractJsonSerializer(typeof(T));
                        return serializer.ReadObject(stream) as T;
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Json can't convert to Object because it isn't correct format.");
                }
        }
    }
}