[英]C# JsonConvert.DeserializeObject returning null values for a json array of objects
[英]Returning JSON Array of Objects in C#
這些是我擁有的類,它們代表我希望將數據顯示給最終用戶的方式:
namespace PHCTimeSeriesInsights.API.Models
{
public class ProductTimeSeries
{
public List<DeviceTimeSeries> DeviceTimeSeries { get; set; }
public string DeviceId { get; set; }
}
public class DeviceTimeSeries
{
public DateTime TimeStamp { get; set; }
public Double MeasuredValue { get; set; }
public string DateField { get; set; }
}
}
我想要以下格式的輸出:這里的字符串8787887是設備的實際值;
{
"8787887":[
{
"prop":"val",
"prop":"val"
},
{
"prop":"val1",
"prop":"val2"
}
]
}
我的這段代碼代表了我所做的事情,但是並沒有給我一種最佳格式:
List<ProductTimeSeries> prd = new List<ProductTimeSeries>();
prd.Add(new ProductTimeSeries
{
DeviceId = getTelemetry.PropertyName,
DeviceTimeSeries = deviceIdTimeSeries
});
這是我得到的結果:
[
{
"deviceTimeSeries": [
{
"timeStamp": "2019-07-19T17:44:55.856Z",
"measuredValue": 6.98,
"dateField": "7/19/2019"
},
{
"timeStamp": "2019-07-19T17:45:58.697Z",
"measuredValue": 7.04,
"dateField": "7/19/2019"
}
],
"deviceId": "deviceId"
}
]
我需要對格式進行哪些更改?
在C#中,您實際上要使用Dictionary,而不是使用類。 在您的情況下,它應該通過使用Dictionary<string, List<DeviceTimeSeries>>
,其中string
是您的“ DeviceId”。
請參見下面的示例。
https://dotnetfiddle.net/luE1Z4
哪個運行
Console.WriteLine("Dictionary Test");
var productTimeSeries2 = new Dictionary<string, IList<DeviceTimeSeries>> () {
{
"DeviceId-888",
new List < DeviceTimeSeries > () {
new Program.DeviceTimeSeries() {
TimeStamp = DateTime.Now,
MeasuredValue = 2,
DateField = "7/29/2019"
}
}
}
};
Console.WriteLine(JsonConvert.SerializeObject(productTimeSeries2));
和輸出
{
"DeviceId-888":[
{
"TimeStamp":"2019-07-31T20:45:28.677905+00:00",
"MeasuredValue":2.0,
"DateField":"7/29/2019"
}
]
}
清單prd
需要是
字典> prd
那么您的對象應序列化為所需的格式。
尚不清楚您要在prop
和value
的值中放入什么
但是我相信結果是您將必須使用某種自定義代碼來寫出您的結構。 下面我用一個自定義JsonConverter
從Json.Net
public class CustomJsonConverter : JsonConverter
{
private readonly Type[] _types;
public CustomJsonConverter(params Type[] types)
{
_types = types;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;
IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();
JObject root = new JObject();
JObject props = JObject.Parse(@"{""prop"" : ""A"", ""value"":""B""}");
root.AddFirst(new JProperty(o["DeviceId"].Value<object>().ToString(), props));
root.WriteTo(writer);
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}
然后,使用自定義轉換器序列化對象
DeviceTimeSeries d = new DeviceTimeSeries { TimeStamp = DateTime.Now, MeasuredValue = 1.23, DateField = "01/01/1970" };
ProductTimeSeries p = new ProductTimeSeries();
List<DeviceTimeSeries> dts = new List<DeviceTimeSeries>();
dts.Add(d);
p.DeviceTimeSeries = dts;
p.DeviceId = "8787887";
string json = JsonConvert.SerializeObject(p, Formatting.Indented, new CustomJsonConverter(typeof(ProductTimeSeries)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.