如何基于JTokenType简化JToken的转换

时间:2016-07-28 06:19:25

标签: c# json.net

是否有任何解决方案以更好/更短的方式重构切换/案例代码?

  • property.ValueJToken
  • opportunity是CRM Dynamics实体(类似于词典)

我尝试了以下方法但没有成功(这是不可接受的C#)

Type target = property.Value.Type.GetType();
opportunity[property.Key] = property.Value.Value<target>();

这是我试图简化的代码。 (JTokenType.ObjectJTokenType.Array以不同的方式处理。)

                switch (property.Value.Type)
                {
                    case JTokenType.Boolean:
                        opportunity[property.Key] = property.Value.Value<bool>();
                        break;
                    case JTokenType.Date:
                        opportunity[property.Key] = property.Value.Value<DateTime>();
                        break;
                    case JTokenType.Integer:
                        opportunity[property.Key] = property.Value.Value<int>();
                        break;
                    case JTokenType.String:
                        opportunity[property.Key] = property.Value.Value<string>();
                        break;
                    case JTokenType.Guid:
                        opportunity[property.Key] = property.Value.Value<Guid>();
                        break;
                }

我也按照@diiN _:

的建议尝试了这个
opportunity[property.Key] = property.Value.Value<dynamic>();

但它会抛出InvalidDataContractException: visual studio exception

2 个答案:

答案 0 :(得分:4)

您可以尝试使用此代替您的switch语句:

if (property.Value is JValue)
{
    opportunity[property.Key] = ((JValue)property.Value).Value;
}

答案 1 :(得分:0)

不确定它是否对您的情况有帮助,但我使用了类似的代码。也许试一试。

 cursor = db.rawQuery(
        "SELECT *
         FROM STUDENT
         LEFT JOIN STUDENT_DETAILS ON
                    STUDENT.STUDENT_ID=STUDENT_DETAILS.STUDENT_ID
         WHERE STUDENT.START_DATE <= ? AND STUDENT.EXPIRED_DATE >= ?
         ORDER BY STUDENT_DETAILS.STUDENT_NAME ASC", 
         new String[]{date, date}
        );