【问题标题】:Convert Dictionary<string,object> to Dictionary<string,class> in c#在 C# 中将 Dictionary<string,object> 转换为 Dictionary<string,class>
【发布时间】:2018-02-04 09:17:30
【问题描述】:

我有一个结构为的 Jtoken。下面的结构比下面有更多的属性,但我只能使用下面的那些

{{ "PersonId": 1234, "State": "Florida", "Gender": "Male", "Married ": 1, "SalaryUnderHundredDollar ": 1, }} 

我创建了一个类 Person

public class Person
{
  public int PersonId {get;set;}
  public string State {get;set;}
  public string Gender {get;set;}
  public bool Married {get; set}
  public bool SalaryUnderHundredDollar {get;set}
}

我将上述 Jtoken 转换为字典:

var dict = jtoken.First.ToObject<Dictionary<string, object>>().ToDictionary(x => x.Key, x => x.Value);

这将给出 Person 的所有属性,但我只想要上面的那些。现在我必须转换

     Dictionary<string,object> to Dictionary<string,class>

我正在做以下事情:

 var dict2= dict.Where(x => fieldsRequired.Contains(x.Key)).ToDictionary(x => x.Key, x => (Person)x.Value);

fieldsRequired 是我需要的字符串字段列表,因为在 Jtoken 中有许多字段。

但是这种转换不起作用。

有什么帮助吗?

【问题讨论】:

  • “不工作”不是错误报告。请更具体。你得到什么结果?你得到什么错误?
  • 无法将布尔类型转换为 Person 类。这是错误
  • 尝试以下操作:Dictionary dict2 = dict.Where(x => fieldsRequired.Contains(x.Key)).ToDictionary(x => x.Key, y => y。值);
  • @jdweng 顺便说一句,我将无法将我的 dict 的值转换为 Person 类型。
  • 你为什么不能?

标签: c# linq dictionary lambda


【解决方案1】:

将你的类修改为:

public class Person
{
  public int PersonId {get;set;}
  public string State {get;set;}
  public string Gender {get;set;}
  public int Married {get; set}
  public int SalaryUnderHundredDollar {get;set}
}

然后使用:

var person = jtoken.First.ToObject<Person>();

问题在于 bool 属性在 JSON 中表示为 0 和 1。因此,我们也将类中的属性类型更改为 int。

更好的选择是将 JSON 修复为具有 true 和 false 而不是 0 和 1。同样奇怪的是,JSON 包裹在双花括号中,"Married " 和 "SalaryUnderHundredDollar " 属性最后包含一个空格。这些问题也应该得到解决。

您还可以编写自定义JsonConverter 以将值从0 和1 适当地转换为bool。见answer here。

将建议放在一起并修复属性名称中的双花括号和空格会导致:

public class BoolConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((bool)value) ? 1 : 0);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value.ToString() == "1";
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string State { get; set; }
    public string Gender { get; set; }
    [JsonConverter(typeof(BoolConverter))]
    public bool Married { get; set; }
    [JsonConverter(typeof(BoolConverter))]
    public bool SalaryUnderHundredDollar { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        string json =
            @"{ ""PersonId"": 1234, ""State"": ""Florida"", ""Gender"": ""Male"", ""Married"": 1, ""SalaryUnderHundredDollar"": 1 }";

        var jObject = JObject.Parse(json);
        var person = jObject.ToObject<Person>();
    }
}

【讨论】:

  • 对不起,我选择了错误的 jtoken,现在我看到 bool 值是真还是假,但仍然面临问题。
  • 你能发布你拥有的代码吗?包括解析,正确的JSON等等?您使用的代码根本不需要 Dictionary 方法,您应该直接转换为 Person 类并完全跳过字典
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
相关资源
最近更新 更多