programing

JSON을 사용하지 않고 JSON을 해석하는 방법NET 라이브러리?

codeshow 2023. 3. 28. 22:22
반응형

JSON을 사용하지 않고 JSON을 해석하는 방법NET 라이브러리?

Visual Studio 2011에서 Windows 8용 메트로 응용 프로그램을 구축하려고 하는데, 이 작업을 수행하는 동안 해석 방법에 문제가 있습니다.JSON없이.JSON.NET라이브러리(아직 메트로 애플리케이션을 지원하지 않습니다).

어쨌든, 이것을 해석하고 싶다.

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

시스템에 있는 클래스를 사용할 수 있습니다. 추가된 Json 네임스페이스.NET 4.5시스템에 대한 참조를 추가해야 합니다.런타임시리얼라이제이션어셈블리

Json Value.Parse() 메서드는 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"]);

클래스는 시스템에서 발견된 클래스와 매우 유사합니다.Xml.Linq 네임스페이스

저는 이걸...메트로 앱 개발을 한 적이 없기 때문에 이용 가능한 라이브러리의 제한은 모릅니다.(클래스에 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);

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은 계약에 따라 작성됩니다.이 계약은 보통 클래스로 분류할 수 있습니다.Tjson에서 단어를 가져와 오브젝트브라우저를 검색하면 해당 유형을 찾을 수 있습니다.

사용 예:

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;

서드파티제의 의존관계나 nuget이 없는 JSON 시리얼라이저와 디시리얼라이저가 필요했기 때문에 오래된 시스템을 지원할 수 있으므로 Newtonsoft를 선택할 필요가 없습니다.Json, 시스템.타겟 플랫폼에 따라 Text.Json, DataContractSerializer, JavaScriptSerializer 등

여기서 오픈소스(MIT) 프로젝트를 시작했습니다.

https://github.com/smourier/ZeroDepJson

C# 파일 1개뿐입니다.ZeroDepJson.cs와 호환성이 있습니다.NET Framework 4.x에서로의NET Core 및.넷 5

상기 모든 라이브러리(특히 퍼포먼스 영역)에 비해서는 그다지 좋지 않을 수 있지만, 비교적 양호하고 마찰이 없습니다.

사용해보셨습니까?JavaScriptSerializer또 다른 것도 있습니다.DataContractJsonSerializer

그렇게 오래전에 작은 구문을 썼는데 네임스페이스가 필요해요.사용하다DataContractJsonSerializerobjectJConvert.

소규모 데이터 집합에서 작동하지만 빅 데이터 소스에서 테스트한 적은 없습니다.

JsonHelper.cs

// Json Serializer without NewtonSoft
public static class JsonHelper
{
    public static R JConvert<P,R>(this P t)
    {       
        if(typeof(P) == typeof(string))
        {
            var return1 =  (R)(JsonDeserializer<R>(t as string));
            return return1;
        }
        else
        {
            var return2 =  (JsonSerializer<P>(t));
            R result = (R)Convert.ChangeType(return2, typeof(R));
            return result;
        }   
    }
    
    private static String JsonSerializer<T>(T t)
    {
        var stream1 = new MemoryStream();
        var ser = new DataContractJsonSerializer(typeof(T));
        ser.WriteObject(stream1, t);
        stream1.Position = 0;
        var sr = new StreamReader(stream1);     
        return (sr.ReadToEnd());
    }
    
    private static T JsonDeserializer<T>(string jsonString)
    {
        T deserializedUser = default(T);
        var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        var ser = new DataContractJsonSerializer(typeof(T));
        deserializedUser = (T)ser.ReadObject(ms);// as T;
        ms.Close();
        return deserializedUser;
    }
}

구문:

「 」를 JsonHelper할 가 있다

JConvert<string,object>(str); //to Parse string to non anonymous <object>
JConvert<object,string>(obj); //to convert <obj> to string

예:

를 들어, 가정해 보겠습니다.person

public class person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

var obj = new person();//"vinod","srivastav");
obj.FirstName = "vinod";
obj.LastName = "srivastav";

「」를 person" " " " " : "

var asText = JsonHelper.JConvert<person,string>(obj); //to convert <obj> to string

var asObject = JsonHelper.JConvert<string,person>(asText); //to convert string to non-anonymous object
  

하시면 됩니다.DataContractJsonSerializer자세한 내용은 이 링크를 참조하십시오.

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.");
                }
        }
    }
}

언급URL : https://stackoverflow.com/questions/9573119/how-to-parse-json-without-json-net-library

반응형