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

C# 如何在没有JSON.NET库的情况下解析JSON?,c#,json,windows-8,C#,Json,Windows 8,我正在尝试在VisualStudio2011上为Windows8构建Metro应用程序。 在我尝试这样做的同时,我遇到了一些问题:如何在没有JSON.NET库的情况下解析JSON(它还不支持metro应用程序) 无论如何,我想分析一下: { "name":"Prince Charming", "artist":"Metallica", "genre":"Rock and Metal", "album":"Reload", "album_image":"http:\/

我正在尝试在VisualStudio2011上为Windows8构建Metro应用程序。 在我尝试这样做的同时,我遇到了一些问题:如何在没有
JSON.NET
库的情况下解析
JSON
(它还不支持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"
}

您是否尝试过使用
JavaScriptSerializer

还有
DataContractJsonSerializer

您可以使用在中找到的类,这些类是在.NET 4.5中添加的。您需要添加对程序集的引用

解析JSON文本并返回:

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


这些类与中的类非常相似。

我使用这个…但从未进行过任何metro应用程序开发,因此我不知道对您可用的库有任何限制。(注意,您需要使用DataContract和DataMember属性将类标记为)

然后你会像这样使用它

[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);
var musicInfo=新的musicInfo
{
Name=“白马王子”,
Artist=“Metallica”,
流派=“摇滚与金属”,
Album=“重新加载”,
相册图像=”http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
链接=”http://f2h.co.il/7779182246886"
};
//这将生成一个JSON字符串
var serialized=JSONSerializer.Serialize(musicInfo);
//这将生成您先前创建的实例的副本
var deserialized=JSONSerializer.DeSerialize(序列化);

您可以使用
DataContractJsonSerializer
。请参阅此处了解更多详细信息。

对于没有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);
}
您可以将其解析为如下所示的
RadComboxClientState
对象:

string ClientStateJson=Page.Request.Form(“ReportGrid1\u cboReportType\u ClientState”);
RadComboxClientState RadComboxClientState=反序列化JSON(ClientStateJson);
返回radcomboxClientState.Value;
使用系统;
使用System.IO;
使用System.Runtime.Serialization.Json;
使用系统文本;
名称空间OTL
{
/// 
///使用前:定义类,示例:
///[数据合同]
///公共类音乐信息
///{
///[DataMember(Name=“music_Name”)]
///公共字符串名称{get;set;}
///[数据成员]
///公共字符串艺术家{get;set;}
///}
/// 
/// 
公共类OTLJSON,其中T:class
{
/// 
///将对象序列化为JSON
///用法:string serialized=OTLJSONMusicInfo.Serialize(musicInfo);
/// 
/// 
/// 
公共静态字符串序列化(T实例)
{
var serializer=newdatacontractjsonserializer(typeof(T));
使用(var stream=new MemoryStream())
{
serializer.WriteObject(流、实例);
返回Encoding.Default.GetString(stream.ToArray());
}
}
/// 
///从JSON反序列化对象
///用法:MusicInfo deserialized=OTLJSONMusicInfo.Deserialize(json);
/// 
/// 
/// 
公共静态T反序列化(字符串json)
{
if(string.IsNullOrEmpty(json))
抛出新异常(“Json不能为空”);
其他的
尝试
{
使用(var stream=newmemoryStream(Encoding.Default.GetBytes(json)))
{
var serializer=newdatacontractjsonserializer(typeof(T));
将serializer.ReadObject(stream)返回为T;
}
}
捕获(例外e)
{
抛出新异常(“Json无法转换为对象,因为它的格式不正确。”);
}
}
}
}

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

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

它只是一个C#文件
ZeroDepJson.cs
,与.NETFramework 4.x到.NETCore和.NET5兼容


请注意,它可能没有前面提到的所有库都好(特别是在性能方面),但它应该是合理的,并且没有摩擦。

您可以像我们在
JSON.NET
和其他库出现之前那样通过字符串操作来完成。使用JavascriptSerializer。看看这个答案:你不应该问这个,微软并没有表现出更多的爱,就像它对Json一样。在
System.Web.Helpers
中有
Json
System.ServiceModel.Web
中有
JsonQueryStringConverter
System.Runtime.Serialization.Json>中有
JavascriptSerializer
DataContractJsonSerializer
。。。一点也不令人困惑。Heck MS甚至决定在其ASP.NET Web API中包含第三方
Json.NET
。如果您认为这还不够的话,MS会推出
System.Json
,但目前不适合使用。Windows 8是MS的特例,因此在
Windows.Data.Json
中也有
JsonValue
,它仅适用于Windows 8及以上版本。截至2016年底:似乎并可能放弃了从未正式发布的
系统。Json
:谈论“预览”,并且该系统(仍然)被标记为“Beta”且未上市,表示反对。(有一个发布的
System.Json
,但它只是Silverlight)。不,你能解释一下那是什么吗?thanx dudeDataContract:JavaScriptSerializer:Re
JavaScriptSerializer
:在撰写本文时
[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);
using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}
{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
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.");
                }
        }
    }
}