【问题标题】:Deserializing JSON with dynamic property使用动态属性反序列化 JSON
【发布时间】:2017-04-13 12:13:19
【问题描述】:

我必须反序列化 JSON 响应(来自 wep API)。问题是这个 API 返回带有动态属性的 JSON。如果是这样的

{
"employees":
[{
"employeeCode": "ABC",
"cityId": 123
},{
"employeeCode": "DEF",
"cityId": 234
}]
}

它本来是完美的,但响应是字符串并且返回如下:

var response = @"{"ABC": 123, "DEF": 234}";

第一个属性是“EmployeeCode”,第二个属性是“CityId”。如何使用 JSON.Net 将其序列化为以下类?

public class Employees
{
public string employeeCode {get; set;}
public string cityId {get; set;}
}

【问题讨论】:

标签: c# json json.net


【解决方案1】:

关于我的评论,也许我们最好写下我提到的例子:

string json = @"{""ABC"": 123, ""DEF"": 234}";

var employees = JsonConvert.DeserializeObject<Dictionary<string, int>>(json).Select(x => new Employees() { employeeCode = x.Key, cityId  = x.Value });

【讨论】:

  • 这仅用于 json 对象,不用于 json 数组,如 { "name":"John", "age":30, "cars":[ "Ford", "BMW", "菲亚特”] }
【解决方案2】:

您需要:

使用 System.IO;

使用 System.Text;

使用 System.Runtime.Serialization.Json;

public static string Serialize<T>(T obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, obj);
string retVal = Encoding.UTF8.GetString(ms.ToArray());
return retVal;
}

public static T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
return obj;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2015-12-05
    相关资源
    最近更新 更多