我有一个API调用,如下所示:
JsonValue result = api.GET("/chart/" + problemList.PatientMRN.ToString() + "/problems", problemInfo);
string resultString = result.ToString();
注意:我指的是System.Json.JsonValue
替代方法(使用JavaScriptSerializer)
Rootobject_Labresult objGResponse = new JavaScriptSerializer().Deserialize<Rootobject_Labresult>(resultString);
从Json中的字符串,我创建了相应的类(使用Visual Studio编辑菜单中的Paste Special)。
public class Rootobject_Labresult
{
public Labresult[] labresults { get; set; }
public int totalcount { get; set; }
}
public class Labresult
{
public string createddate { get; set; }
public DateTime createddatetime { get; set; }
public string departmentid { get; set; }
public string description { get; set; }
}
但是当我创建一个数组时,我遇到了错误。
Labresult[] labresults = result[0];
////Error: cannot implicitly convert type System.Json.JsonValue to Labresult
将 JsonValue 转换为域对象(Labresult)的最佳方法是什么?
答案 0 :(得分:15)
使用Json.Net
也可以更简单 JsonConvert.DeserializeObject<T> Method (String)
SELECT * FROM (`leadactivity`)
WHERE statusdate between '$thedate 00:00:00' and '$thedate 23:59:59'
ORDER BY id DESC LIMIT 25
从那里你应该能够提取所需的域值。
就这么简单,你可以创建一个扩展
//...code removed for brevity
string json = result.ToString();
Rootobject_Labresult rootObject = JsonConvert.DeserializeObject<Rootobject_Labresult>(json);
Labresult[] labresults = rootObject.labresults;
进一步减少原始代码
public static class JsonValueExtensions {
public static T ToObject<T>(this JsonValue value) {
return JsonConvert.DeserializeObject<T>(value.ToString());
}
}
假设上述代码段示例中的//...code removed for brevity
Rootobject_Labresult rootObject = result.ToObject<Rootobject_Labresult>();
Labresult[] labresults = rootObject.labresults;
是result
的实例
答案 1 :(得分:1)
我相信使用Json.NET
从string / System.Json.JsonValue转换为DotNet Object的最佳方法您需要的只是Newtonsoft.Json.Linq命名空间,您可以使用一行代码来完成所有对话
using Newtonsoft.Json.Linq;
var result = JToken.Parse(jsonVal.ToString()).ToObject<Rootobject_Labresult>();
我在这里创建了一个示例。 https://dotnetfiddle.net/N2VfKl
这是使用Json.NET进行对象对话的另一个示例 https://dotnetfiddle.net/rAkx7m
Json.Net还允许您使用json对象而无需声明类。 https://dotnetfiddle.net/ZIA8BV