WCF 서비스의 JSON 문자열을 null 출력을 표시하는 C # 목록으로 역 직렬화하려고합니다.
WCF 서비스
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json
)]
public String getuserSite(String UserCode)
{
string s = "";
{
_ds = new DataSet();
try
{
_dbObj = new Database();
if (ConfigurationManager.AppSettings["DB"].ToString() == "S")
{
string[] _paramNames = { "@UserCode" };
object[] _paramvalue = { UserCode };
_ds = _dbObj.GetDatasetProc("getuserSite", _paramNames, _paramvalue);
}
else
{
string[] _paramNames = { "UserCode" };
object[] _paramvalue = { UserCode };
_ds = _dbObj.GetDatasetProc("getuserSite", _paramNames, _paramvalue);
}
return **GetJSONString**(_ds, "Sites");
}
catch (Exception ex)
{
throw ex;
}
finally
{
_dbObj.Close();
}
}
GetJSONString 메서드는 JSON 문자열을 반환합니다.
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json
)]
public static string GetJSONString(DataSet Ds, String Name)
{
DataTable Dt = Ds.Tables[0];
if (Name != "")
{
Dt.TableName = Name;
}
string[] StrDc = new string[Dt.Columns.Count];
string HeadStr = string.Empty;
for (int i = 0; i < Dt.Columns.Count; i++)
{
StrDc[i] = Dt.Columns[i].Caption;
HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
}
HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
StringBuilder Sb = new StringBuilder();
if (Name != "")
{
Sb.Append("{\"" + Dt.TableName + "\" : [");
}
else
{
Sb.Append("[");
}
for (int i = 0; i < Dt.Rows.Count; i++)
{
string TempStr = HeadStr;
Sb.Append("{");
for (int j = 0; j < Dt.Columns.Count; j++)
{
TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString().Replace("\r\n", "<br>").Replace("\r", "<br>").Replace("\n", "<br>").Replace("\"",""));
}
if (i < Dt.Rows.Count - 1) { Sb.Append(TempStr + "},"); } else { Sb.Append(TempStr + "}"); };
}
Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length));
if (Name != "")
{
Sb.Append("]}");
}
else
{
Sb.Append("]");
}
return Sb.ToString();
}
Json 문자열 출력
"\"{\\\"Sites\\\" : [{\\\"EQ_DESC\\\" : \\\"SIERRA India\\\",\\\"EQ_CODE\\\" : \\\"1\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Dubai\\\",\\\"EQ_CODE\\\" : \\\"24\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Malaysia\\\",\\\"EQ_CODE\\\" : \\\"99\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA US\\\",\\\"EQ_CODE\\\" : \\\"100\\\"},{\\\"EQ_DESC\\\" : \\\"Mars India\\\",\\\"EQ_CODE\\\" : \\\"110\\\"},{\\\"EQ_DESC\\\" : \\\"???\\\",\\\"EQ_CODE\\\" : \\\"151\\\"},{\\\"EQ_DESC\\\" : \\\"turkey\\\",\\\"EQ_CODE\\\" : \\\"2299\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Infosys\\\",\\\"EQ_CODE\\\" : \\\"2331\\\"},{\\\"EQ_DESC\\\" : \\\"Infosys\\\",\\\"EQ_CODE\\\" : \\\"2338\\\"}]}\""
C # 클래스 (모델)
public class Site
{
public string EQ_DESC { get; set; }
public string EQ_CODE { get; set; }
}
public class RootObject
{
public List<Site> Sites { get; set; }
}
이제 json을 목록으로 역 직렬화
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
/* Deserializing json data from service */
var jsoncontent = reader.ReadToEnd();
string s = jsoncontent.ToString();
var results = JsonConvert.DeserializeObject<RootObject>(s);
출력 :
var results = JsonConvert.DeserializeObject<Rootobject>(s);
** 이전에 시도했지만 null을 반환합니다 **
var results = JsonConvert.DeserializeObject<List<site>>(s);
위의 코드는 Null을 반환합니다.
문제를 해결하도록 친절하게 제안합니다.
감사
벤 카테시
JSON 문자열 출력은 List<Site>
. RootObject
클래스는 아니다 List<Site>
그러나 속성이 포함되어 Sites
유형의를 List<Site>
. 다음과 같이 시도해야합니다.
첫 번째 해결책 :
var results = JsonConvert.DeserializeObject<List<Site>>(s);
두 번째 솔루션 :
다음과 같이 RootObject를 수정하십시오.
public class RootObject : List<Site>
{
//Whatever you want
}
그리고 다음과 같이 deserializer를 사용합니다.
var results = JsonConvert.DeserializeObject<RootObject>(s);
도움이 되었기를 바랍니다
편집 : 이것은 테스트 할 것입니다
왜 JSON 문자열을 반환 했습니까? 즉, 직렬 변환기를 사용하는 경우 결과를 JSON 문자열로 자동으로 변환하도록 서버를 지정한 다음 요청 내에서 스트림을 검색하고 이미 수행 한대로 역 직렬화 할 수 있습니다. 내 컴퓨터에서 작동하는 것을 보여 드리겠습니다.
FIRST : 서비스 계약 인터페이스 :
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
List<Site> getuserSite(String UserCode);
}
SECOND : 서비스 계약 이행
public class ServiceContract : IServiceContract
{
public List<Site> getuserSite(String UserCode)
{
//Do whatever you want that return a List<Site>
}
}
셋째 : 모델
[DataContract]
public class Site
{
[DataMember]
public string EQ_DESC { get; set; }
[DataMember]
public string EQ_CODE { get; set; }
}
넷째 : 데이터 계약을 참조한 후 클라이언트 측에서
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
/* Deserializing json data from service */
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(List<Site>));
var result= deserializer.ReadObject(response.GetResponseStream());
}
결과적으로 JSON deserialized 응답에 해당하는 목록이 있습니다. 코드에서 작동하도록하는 방법을 찾길 바랍니다. 필요한 경우 저에게 연락 주시기 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다