[英]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.