gpt4 book ai didi

c# - JSON 反序列化为对象,具有部分动态属性

转载 作者:行者123 更新时间:2023-11-30 23:32:52 25 4
gpt4 key购买 nike

我正在调用一个休息服务,该服务返回 JSON 内容。大多数内容都有预定义的结构,但有些内容是基于传递给其余服务的参数的动态内容。一旦我从其余服务获得响应,我想反序列化为一个对象,以便我可以轻松地使用数据。我目前正在使用 DataContractJsonSerializer 来执行此操作。

/// <summary>
/// Deserialize JSON formatted string to an object of a specified type
/// </summary>
/// <typeparam name="T">Object type to deserialize</typeparam>
/// <param name="sJSON">JSON formatted string to deserialize</param>
/// <returns>Returns an instance of an object</returns>
public static T FromJSON<T>(this string sJSON) where T : new()
{
T oValue;

using (System.IO.MemoryStream strJSON = new System.IO.MemoryStream())
{
using (System.IO.StreamWriter swJSON = new System.IO.StreamWriter(strJSON))
{
swJSON.Write(sJSON);
swJSON.Flush();

strJSON.Seek(0, System.IO.SeekOrigin.Begin);

System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
oValue = (T)ser.ReadObject(strJSON);

return oValue;
}
}
}

以下是其余服务响应的示例:

{
"entities" : [{
"type" : "mytest",
"properties" : {
"Active" : true,
"Category" : "10732",
"Description" : "test test test",
"LastUpdateTime" : 1446676525195,
"Id" : "12655"
}
}
],
"metadata" : {
"status" : "OK",
"count" : 0
}
}

对象总是有一个“实体”和“元数据”属性,元数据总是有一个“状态”和“计数”属性,实体总是一个数组,数组中的每一项都有“类型”和“属性”属性。属性对象的动态性质开始发挥作用,该对象将包含完全基于传递到其余服务的内容的属性。

这是类定义,我一直用来将 json 字符串反序列化为对象。但我不确定如何使属性部分动态化。即使我最终可以得到可行的名称值字典。这是否可能,理想情况下不需要第 3 方 json 库?

[DataContract]
public class Response
{
[DataMember(
public Entity[] entities { get; set; }

[DataMember(
public MetaData metadata { get; set; }
}

[DataContract]
public class Entity
{
[DataMember(
public string type { get; set; }

[DataMember()]
public Properties properties { get; set; }
}


[DataContract]
public class Properties
{
//How do I make this part dynamic?
}

[DataContract]
public class MetaData
{
[DataContract]
public enum Status
{
[EnumMember]
OK,

[EnumMember]
FAILED
}

public Status CompletionStatus { get; set; }

[DataMember()]
public string status
{
get
{
return this.CompletionStatus.ToString();
}
set
{
this.CompletionStatus = (Status)Enum.Parse(typeof(Status), value);
}
}

[DataMember()]
public int count{ get; set; }
}

最佳答案

将您的属性更改为:

[DataMember]
public Dictionary<string, object> properties { get; set; }

然后你需要配置序列化器:

var ser = new DataContractJsonSerializer(typeof(T), new DataContractJsonSerializerSettings {
UseSimpleDictionaryFormat = true
});

关于c# - JSON 反序列化为对象,具有部分动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com