내가하는 일은 API를 호출하고 응답을 C # 개체로 바꾸는 것입니다. 내 작업 코드 https://codereview.stackexchange.com/questions/253949/api-response-json-to-c-object/ 를 리팩터링하려고합니다 . 이제 codereview에서 제안 된 코드에 다음 오류가 발생합니다.
Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Candlestick' because the type requires a JSON object (e.g. {"name":"
value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be
deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
API의 Json 응답 :
[
[
1609065000000,
"22739.71000000",
"22795.73000000",
"22700.39000000",
"22779.08000000",
"38.81782800",
1609065899999,
"883167.94526884",
2261,
"18.58965200",
"423036.58181400",
"0"
]
]
[System.Text.Json.Serialization.JsonConverter(typeof(CandlestickConverter))]
public class Candlestick
{
public long OpenTime { get; set; }
public double Open { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; }
public double Volume { get; set; }
public long CloseTime { get; set; }
public double QuoteAssetVolume { get; set; }
public long NumberOfTrades { get; set; }
public double TakerBuyBaseAssetVolume { get; set; }
public double TakerBuyQuoteAssetVolume { get; set; }
}
public class CandlestickConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var candle = (Candlestick) value;
serializer.Serialize(writer ,
new[]
{
candle.OpenTime,
candle.Open,
candle.High,
candle.Low,
candle.Close,
candle.Volume,
candle.CloseTime,
candle.QuoteAssetVolume,
candle.NumberOfTrades,
candle.TakerBuyBaseAssetVolume,
candle.TakerBuyQuoteAssetVolume
});
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var candle = existingValue as Candlestick ?? new Candlestick();
var array = JArray.Load(reader);
candle.OpenTime = array.ElementAtOrDefault(0)?.ToObject<long>(serializer) ?? 0;
candle.Open = array.ElementAtOrDefault(1)?.ToObject<double>(serializer) ?? 0;
candle.High = array.ElementAtOrDefault(2)?.ToObject<double>(serializer) ?? 0;
candle.Low = array.ElementAtOrDefault(3)?.ToObject<double>(serializer) ?? 0;
candle.Close = array.ElementAtOrDefault(4)?.ToObject<double>(serializer) ?? 0;
candle.Volume = array.ElementAtOrDefault(5)?.ToObject<double>(serializer) ?? 0;
candle.CloseTime = array.ElementAtOrDefault(6)?.ToObject<long>(serializer) ?? 0;
candle.QuoteAssetVolume = array.ElementAtOrDefault(7)?.ToObject<double>(serializer) ?? 0;
candle.NumberOfTrades = array.ElementAtOrDefault(8)?.ToObject<long>(serializer) ?? 0;
candle.TakerBuyBaseAssetVolume = array.ElementAtOrDefault(9)?.ToObject<double>(serializer) ?? 0;
candle.TakerBuyQuoteAssetVolume = array.ElementAtOrDefault(10)?.ToObject<double>(serializer) ?? 0;
return candle;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Candlestick);
}
}
전환의 구현 :
var jsonObjectResponse = await response.Content.ReadAsStringAsync();
var candles = JsonConvert.DeserializeObject<List<Candlestick>>(jsonObjectResponse);
나는 또한 시도했다 var candles = JsonConvert.DeserializeObject<List<Candlestick>>($"{{{jsonObjectResponse}}}");
이것은 다음 오류를 제공했습니다. Newtonsoft.Json.JsonReaderException: Invalid property identifier character: [. Path '', line 1, position 1.
json 응답 객체는 이전에 작업 한 적이없는 것입니다. 나는 그것을 작동했지만 더 깨끗한 코드를 원하며 내가 제공 한 링크에서 제안한대로 작동하도록 노력하고 있습니다. 누구든지 해결이 무엇인지 또는 더 많은 정보를 찾을 수있는 곳을 알고 있습니까?
@TomekSzpakowicz가 그의 의견에 답을주었습니다. 사용자 지정 변환기를 등록해야했기 때문에 시작 파일에 다음 코드를 추가했습니다.
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new CandlestickConverter(),
}
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다