Làm thế nào để phân tích cú pháp JSON mà không có thư viện JSON.NET?


77

Tôi đang cố gắng tạo ứng dụng Metro cho Windows 8 trên Visual Studio 2011. và trong khi cố gắng làm điều đó, tôi gặp một số vấn đề về cách phân tích cú pháp JSONmà không có JSON.NETthư viện (Nó chưa hỗ trợ các ứng dụng metro) .

Dù sao, tôi muốn phân tích cú pháp này:

{
   "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"
}

1
Bạn có thể làm điều đó với thao tác chuỗi giống như chúng tôi đã làm trước đây JSON.NETvà các thư viện khác đã ra đời.
M.Babcock

Sử dụng JavascriptSerializer. Hãy xem câu trả lời này: stackoverflow.com/questions/8405458/...
Frenchie

3
Bạn không nên hỏi điều này, MS đã không thể hiện tình yêu nhiều hơn đối với bất cứ điều gì giống như nó có đối với Json. Có Jsontrong System.Web.Helpers, có JsonQueryStringConvertertrong System.ServiceModel.Web, có JavascriptSerializertrong System.Web.Script.Serialization, DataContractJsonSerializertrong System.Runtime.Serialization.Json... Không hề bối rối.
nawfal

3
Heck MS thậm chí đã quyết định đưa bên thứ ba Json.NETvào API Web ASP.NET của mình. Nếu bạn nghĩ như vậy là chưa đủ, MS đang đưa ra System.Jsonnhưng hiện tại không thích hợp để tiêu thụ. Và Windows 8 là một trường hợp đặc biệt cho MS, vì vậy cũng có JsonValuetrong Windows.Data.Jsonđó chỉ dành cho Windows 8 trở lên.
nawfal

1
Vào cuối năm 2016: Có vẻ như Microsoft đã chấp nhận Json.NET và có thể từ bỏ phiên bản chưa bao giờ được phát hành chính thức System.Json: msdn.microsoft.com/en-us/library/… nói về "bản xem trước" và gói Nuget là cả hai (vẫn ) được gắn nhãn "Beta" và không được công bố , đề xuất không dùng nữa. (Có một bản phát hành System.Json, nhưng nó chỉ dành cho Silverlight).
mklement0

Câu trả lời:


96

Bạn có thể sử dụng các lớp được tìm thấy trong Không gian tên System.Json đã được thêm vào .NET 4.5. Bạn cần phải thêm một tham chiếu đến System.Runtime.Serialization lắp ráp

Các JsonValue.Parse () Phương pháp phân tích cú pháp JSON văn bản và trả về một JsonValue :

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

Nếu bạn truyền một chuỗi với một đối tượng JSON, bạn sẽ có thể truyền giá trị cho một 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"]);

Các lớp khá giống với những lớp được tìm thấy trong Không gian tên System.Xml.Linq .


19
Bạn cần thêm một tham chiếu đến cụm System.Runtime.Serialization.
dtb

8
Sử dụng Nuget để cài đặt system.json: Install-Package System.Json
GordonB

3
Nếu không thể tìm thấy gói, hãy đảm bảo bạn thêm số phiên bản. Ví dụ: PM> Install-Package System.Json -Version 4.0.20126.16343. Tìm phiên bản hiện tại tại đây: nuget.org/packages/System.Json
Adam K Dean,

5
System.Json vẫn đang trong giai đoạn thử nghiệm và vì vậy gói Nuget dường như là cách để có được nó. Nó không được tích hợp sẵn trong Framework V 4.5.1 đầy đủ mới nhất. Cá nhân tôi thích API của Json.Net ít dài dòng hơn nhiều và nhanh hơn Windows.Data.Json hoặc System.Json. Xem james.newtonking.com/json/help/html/…
Shital Shah

3
không thể tìm thấy system.json
kuldeep

38

Tôi sử dụng cái này ... nhưng chưa bao giờ thực hiện bất kỳ phát triển ứng dụng metro nào, vì vậy tôi không biết bất kỳ hạn chế nào đối với các thư viện có sẵn cho bạn. (lưu ý, bạn sẽ cần đánh dấu các lớp của mình là với các thuộc tính DataContract và 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;
        }
    }
}

Vì vậy, nếu bạn có một lớp học như thế này ...

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

}

Sau đó, bạn sẽ sử dụng nó như thế này ...

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

Làm thế nào để tôi sử dụng nó? nó tiếp tục hỏi tôi về TType, đó là gì?
Eli Revah

Nếu loại của bạn (class) được gọi MyType, bạn sẽ sử dụng nó như thế này: JSONSerializer <MyType> .Serialize () và JSONSerializer <MyType> .Deserialize (myInstanceOfMyType)
ctorx

2
Có vẻ như dtb có một cách gốc mới hơn (đã trả lời ở trên) nếu bạn đang sử dụng v4.5 của Framework.
ctorx

Bạn phải sử dụng Encoding.UTF8.GetString (stream.ToArray ()); nếu bạn muốn hỗ trợ unicode.
mrexodia

Bạn xử lý như thế nào, nếu bạn có một đối tượng bên trong đối tượng tùy chỉnh của mình không có thuộc tính DataContract và DataMember?
LEMUEL ADANE

7

Đối với những người không có 4.5, Đây là chức năng thư viện của tôi đọc json. Nó yêu cầu tham chiếu đến dự án System.Web.Extensions.

using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}

Thông thường, json được viết ra dựa trên một hợp đồng. Hợp đồng đó có thể và thường sẽ được hệ thống hóa trong một lớp (T ). Đôi khi bạn có thể lấy một từ từ json và tìm kiếm trên trình duyệt đối tượng để tìm loại đó.

Ví dụ sử dụng:

Đưa ra json

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

Bạn có thể phân tích cú pháp nó thành một RadComboBoxClientStateđối tượng như sau:

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


1

Bạn có thể sử dụng DataContractJsonSerializer. Xem liên kết này để biết thêm chi tiết.


Tôi đã thử điều đó với mã này {DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Bài hát)); Mục bài hát = (Bài hát) ser.ReadObject (MemoryStream mới (Encoding.UTF8.GetBytes (bài hát))); Debug.WriteLine (item.name); } và nó mang lại cho tôi một lỗi
Eli Revah

Lỗi là Loại 'Test1.Song' không thể được tuần tự hóa. Cân nhắc đánh dấu nó bằng thuộc tính DataContractAttribute và đánh dấu tất cả các thành viên của nó mà bạn muốn tuần tự hóa bằng thuộc tính DataMemberAttribute. Nếu loại là một tập hợp, hãy cân nhắc đánh dấu nó bằng CollectionDataContractAttribute. Xem tài liệu Microsoft .NET Framework để biết các loại được hỗ trợ khác.
Eli Revah

1
@EliRevah - Bạn cần xác định hợp đồng dữ liệu cho quá trình giải mã hóa bằng thuộc tính [DataContract] cho lớp và thêm thuộc tính [DataMember] cho từng thành viên.
TheBoyan

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.");
                }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.