簡體   English   中英

在C#中返回JSON對象數組

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

那么您的對象應序列化為所需的格式。

尚不清楚您要在propvalue的值中放入什么

但是我相信結果是您將必須使用某種自定義代碼來寫出您的結構。 下面我用一個自定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM