programing

JSON을 로 변환하는 동안 오류가 발생했습니다.asp.net의 넷오브젝트

nicegoodjob 2023. 4. 4. 23:01
반응형

JSON을 로 변환하는 동안 오류가 발생했습니다.asp.net의 넷오브젝트

asp.net에서 JSON 문자열을 .net 객체로 변환할 수 없습니다.숨김 필드를 사용하여 클라이언트에서 서버로 JSON 문자열을 보냅니다(JSON 개체를 유지함).숨김 필드의 Tostring() 및 파일 뒤에 있는 코드의 숨김 필드 값을 읽습니다.

Json 문자열/개체:

 [[{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"},
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}],
[{"OfferId":"1","OrderValue":"99","HostingTypeID":"6"}],
[{"OfferId":"1","OrderValue":"10","HostingTypeID":"8"}]]

.Net 객체

public class JsonFeaturedOffer
{
    public string OfferId { get; set; }

    public string OrderValue { get; set; }

    public string HostingTypeID { get; set; }
}

파일 뒤의 코드 변환 코드

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value);
        MemoryStream stream = new MemoryStream(byteArray);
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer));
        object result= serializer.ReadObject(stream);
        JsonFeaturedOffer jsonObj = result as JsonFeaturedOffer;

변환 중에 다음 오류가 발생합니다.

네임스페이스 "에 요소 'root'이 필요합니다.이름이 ' , 네임스페이스 '인 '없음'이 발견되었습니다.

유감스럽게도 제안된 솔루션 중 문제의 진짜 원인을 해결하는 솔루션은 없습니다.이 예외는 디시리얼라이저가 스트림의 끝에서 읽기를 시도함을 의미합니다.

해결책은 스트림을 선두로 되돌리는 것입니다.즉, 역직렬화 전을 설정합니다.

또, 코멘트에 기재되어 있듯이, StreamWriter 를 사용하고 있는 경우는, 스트림을 사용하기 전에 플래시 할 필요가 있습니다.

이것을 수동으로 실행하는 대신 내장된 경량 자바스크립트 Serializer를 사용할 것을 권장합니다.serialize/deserialize할 클래스에는 속성이 필요하지 않습니다.

또한 모든 wcf에 신경 쓸 필요가 없기 때문에 DataContractJsonSerializer보다 유연하고 빠릅니다.또한 범용 오버로드가 있어 사용이 매우 간단하며 익명 유형도 처리할 수 있습니다.

시리얼화:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var objectAsJsonString = serializer.Serialize(objectToSerialize);

역직렬화:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
JsonFeaturedOffer deserializedObject = serializer.Deserialize<JsonFeaturedOffer>(s_JsonBaseDate);

더욱 쉽게 하기 위해 개체/스트링에서 직접 json 직렬화/직렬화를 제공하는 확장 메서드를 만들 수 있습니다.

클래스를 json/xml로 자동 직렬화하거나 오브젝트로 역직렬화하려면 직렬화 가능한 속성으로 클래스를 장식해야 합니다.

[Serializable, XmlRoot("JsonFeaturedOffer"), DataContract(Name="JsonFeaturedOffer")]
public class JsonFeaturedOffer  
{
    [XmlElement ("OfferId"), DataMember(Name="OfferId")]
    public string OfferId {get; set;}

...등등

Json Featured Offers 어레이의 경우 다음과 같이 해야 합니다.

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value);
MemoryStream stream = new MemoryStream(byteArray);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer[][]));
object result= serializer.ReadObject(stream);
JsonFeaturedOffer[][] jsonObj = result as JsonFeaturedOffer[][];

언급URL : https://stackoverflow.com/questions/2668626/error-converting-json-to-net-object-in-asp-net

반응형