c#中如何将匿名json作为类成员并全部转换为json

de90aj5v  于 2023-01-18  发布在  C#
关注(0)|答案(3)|浏览(215)

我有一个定义良好的类,用于在HTTP请求中作为JSON主体发送。

public class EventData
{
    public string deviceJobId { get; set; }
    public int eventID { get; set; }
    public long time_ms { get; set; }
    /// similar fields
}

现在我必须再添加一个名为HealthInfo的字段,这个新的HealthInfo的值是从某个文件中读取的嵌套JSON,这个JSON文件的字段会不时地更改,并且不能保证某些字段始终存在。
我不想读取/修改它的任何值,只需要将这个EventData作为HTTP请求的一部分作为json发布。
那么如何正确添加HealthInfo呢?
我尝试将HealthInfo作为字符串,对象被双重序列化。

iswrvxsc

iswrvxsc1#

在添加新的json字符串之前,必须转换为JObject

JObject jo = JObject.FromObject(eventData);

jo["HealthInfo"] = jsonStringHealthInfo;

//or it could be (your question needs some details)
jo["HealthInfo"]=JObject.Parse(jsonStringHealthInfo);

StringContent   content = new StringContent(jo.ToString(), Encoding.UTF8, "application/json");

var response = await client.PostAsync(api, content))
5gfr0r5j

5gfr0r5j2#

如果您知道HealthInfo中所有可能的属性,那么您可以创建一个具有可空属性的新类HealthInfo

public class HealthInfo
{
    public string? SomeData { get; set; }
    public int? SomeOtherData { get; set; }
}

然后在主类中添加可为空的HealthInfo:

public class EventData
{
    public string deviceJobId { get; set; }
    public int eventID { get; set; }
    public long time_ms { get; set; }
    public HealthInfo? HealthInfo { get; set; }
    /// similar fields
}

但是,如果您不确定将获得哪种类型的数据,并且希望避免双重序列化,只需将HealthInfo作为object传递即可:

public class EventData
{
    public string deviceJobId { get; set; }
    public int eventID { get; set; }
    public long time_ms { get; set; }
    public object? HealthInfo { get; set; }
    /// similar fields
}
tmb3ates

tmb3ates3#

你可以使用C#反射。(TypeBuilder.defineProperty方法)事实上你必须在运行时给类添加prop。
详情请参阅
https://learn.microsoft.com/

相关问题