json 데이터를 역 직렬화하는 데 문제가 있습니다. 다른 json 데이터와 함께 성공적으로 사용하고있는이 코드가 있습니다.
string url = string.Format("http://farmsense-prod.apigee.net/v1/moonphases/?d=1494981184");
var http = new HttpClient();
var response = await http.GetAsync(url);
var result = await response.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(Lunar_data.RootObject));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data_moon = (Lunar_data.RootObject)serializer.ReadObject(ms);
return data_moon;
이 코드는 null 값만 반환합니다!
다음은 https://jsonutils.com /으로 생성 된 클래스입니다.
public class Lunar_data
{
public class RootObject
{
[JsonProperty("Error")]
public int Error { get; set; }
[JsonProperty("ErrorMsg")]
public string ErrorMsg { get; set; }
[JsonProperty("TargetDate")]
public string TargetDate { get; set; }
[JsonProperty("Moon")]
public IList<string> Moon { get; set; }
[JsonProperty("Index")]
public int Index { get; set; }
[JsonProperty("Age")]
public double Age { get; set; }
[JsonProperty("Phase")]
public string Phase { get; set; }
[JsonProperty("Distance")]
public double Distance { get; set; }
[JsonProperty("Illumination")]
public double Illumination { get; set; }
[JsonProperty("AngularDiameter")]
public double AngularDiameter { get; set; }
[JsonProperty("DistanceToSun")]
public double DistanceToSun { get; set; }
[JsonProperty("SunAngularDiameter")]
public double SunAngularDiameter { get; set; }
}
}
그리고 이것은 정말 간단하지만 올바르게 얻을 수없는 내 json 데이터입니다.
[{"Error":0,"ErrorMsg":"success","TargetDate":"1350526582","Moon":["Hunter's\/Harvest Moon"],"Index":2,"Age":2.9555953469264,"Phase":"Waxing Crescent","Distance":363325.22,"Illumination":0.1,"AngularDiameter":0.54815395361483,"DistanceToSun":149016616.79983,"SunAngularDiameter":0.53520976935835}]
마지막으로 몇 가지 검색 후 Newtonsoft.Json을 사용하는 사람들을 찾았 지만 json 데이터의 따옴표로 인해 사용할 수 없었습니다.
문제는 json이 배열이고 RootObject 인스턴스로 역 직렬화된다는 것입니다. 나는 시도했다
const string jsondata = "[{\"Error\":0,\"ErrorMsg\":\"success\",\"TargetDate\":\"1350526582\",\"Moon\":[\"Hunter's\\/Harvest Moon\"],\"Index\":2,\"Age\":2.9555953469264,\"Phase\":\"Waxing Crescent\",\"Distance\":363325.22,\"Illumination\":0.1,\"AngularDiameter\":0.54815395361483,\"DistanceToSun\":149016616.79983,\"SunAngularDiameter\":0.53520976935835}]";
Lunar_data.RootObject[] res = JsonConvert.DeserializeObject<Lunar_data.RootObject[]>(jsondata);
그리고 그것은 잘 작동했습니다. json이 내 코드의 문자열 const에 있기 때문에 따옴표를 이스케이프해야했지만 그럴 필요는 없습니다 (http 호출에서 얻은 응답이 올바른 형식이라고 가정).
또는 코드에서
Lunar_data.RootObject
와
Lunar_data.RootObject[]
그래서 당신은 얻을
var serializer = new DataContractJsonSerializer(typeof(Lunar_data.RootObject[]));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
var data_moon = (Lunar_data.RootObject[])serializer.ReadObject(ms);
그리고 그것은 작동합니다. 하지만 저는 Newtonsoft를 사용할 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다