【问题标题】:Deserialize dynamic object name for newtonsoft property反序列化 newtonsoft 属性的动态对象名称
【发布时间】:2016-04-28 19:34:40
【问题描述】:

当我发送对某个 API 的请求时,他们返回给我一个很棒的 json,但问题是根据我提供的参数,对象名称总是不同的,而数据结构保持不变。所以我正在尝试使用 Newtonsoft 库将 json 转换为 C# 类。我发现做到这一点的唯一方法是使用 JsonTextReader,但我想知道是否有更简洁的方法来实现这一点,我查阅了文档,在这方面找不到任何帮助我的方法。我也尝试使用 JValue.Parse 进行动态对象映射,但由于属性名称总是不同的,它对我没有帮助。 下面是一个代码示例来说明问题:

{
"error": [],
  "result": {
    //This property name always changes
    "changingPropertyName": [
      [
        "456.69900",
        "0.03196000",
        1461780019.8014,
      ]]
    }

//C# mapping
public partial class Data
{
    [JsonProperty("error")]
    public object[] Error { get; set; }

    [JsonProperty("result")]
    public Result Result { get; set; }
}

public class Result
{
    [JsonProperty("changingPropertyName")]
    public object[][] changingPropertyName{ get; set; }
}

【问题讨论】:

  • 您不能对属性执行此操作。您必须编写一个自定义转换器或类似的东西。

标签: c# json json.net deserialization


【解决方案1】:

处理变量属性名称的一种方法是使用Dictionary<string, T> 代替强类型类(其中T 是您尝试捕获的变量属性的类型)。例如:

public partial class Data
{
    [JsonProperty("error")]
    public object[] Error { get; set; }

    [JsonProperty("result")]
    public Dictionary<string, object[][]> Result { get; set; }
}

然后,您可以从字典中获取第一个 KeyValuePair,您将获得变量属性的名称和可用的值。

string json = @"
{
  ""error"": [],
  ""result"": {
    ""changingPropertyName"": [
      [
        ""456.69900"",
        ""0.03196000"",
        1461780019.8014
      ]
    ]
  }
}";

var data = JsonConvert.DeserializeObject<Data>(json);

KeyValuePair<string, object[][]> pair = data.Result.First();
Console.WriteLine(pair.Key + ":");
object[][] outerArray = pair.Value;

foreach (var innerArray in outerArray)
{
    foreach (var item in innerArray)
    {
        Console.WriteLine(item);
    }
}

小提琴:https://dotnetfiddle.net/rlNKgw

【讨论】:

  • 没问题;很高兴你发现它有用。
【解决方案2】:

您可以使用以下方法将其反序列化为 c# 动态:

dynamic dynamicObj= JsonConvert.DeserializeObject<dynamic>(jsonResultString);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2016-10-21
    • 2020-09-06
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多