如何正确反序列化和映射它?
How can I deserialize and map this correctly?
我正在构建一个消耗 API 的 Dynamics CRM 插件,这是我的问题。
当我得到这个 Json 字符串时,我可以轻松地进行映射。而且我可以正确调用它。
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
我的代码:
public string callRestAPI()
{
var request = (HttpWebRequest)WebRequest.Create("https://jsonplaceholder.typicode.com/posts/2");
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
var response =(HttpWebResponse)request.GetResponse();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string content = string.Empty;
using (var stream = response.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
return content = sr.ReadToEnd();
}
}
throw new Exception($"api data is {content}");
}
..
映射
public class RootObject
{
public int userId { get; set; }
public int id { get; set; }
public string title { get; set; }
public string body { get; set; }
}
..现在我如何称呼它的示例
string Consume = callRestAPI();
var Accs = JsonConvert.DeserializeObject<RootObject>(Consume);
try
{
Entity createcontact = new Entity("contact");
createcontact["firstname"] = "Joe";
createcontact["lastname"] = Accs.title;
createcontact["emailaddress1"] = "Joe.doe@gmail.com";
但是当我得到这种类型的字符串时,我对它感到困惑,而且我似乎无法正确地调用它。当我必须从第一个字符串 API 获取数据时,我的代码有效,但是当我更改为第二个 API 产生以下字符串时,我的代码不起作用,我只是感到困惑。
{
"data": {
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
}
}
您的第一个 json 片段:
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
... 正确映射到 RootObject
class.
但是,您的第二个 json 代表 层级 :
{
"data": {
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
}
}
... 有根对象,然后是 data
对象,所以它不能映射到 RootObject
(所以从语义上讲,它不应该被称为“RootObject"。
所以你有两个选择:
只需添加代表该层次结构的 class:
public class Response
{
public RootObject data { get; set; }
}
... 然后:
JsonConvert.DeserializeObject<Response>(json);
或者,select 嵌套对象 json 仅:
string dataJson = JObject.Parse(json).SelectToken("data").ToString();
var data = JsonConvert.DeserializeObject<RootObject>(dataJson);
我正在构建一个消耗 API 的 Dynamics CRM 插件,这是我的问题。 当我得到这个 Json 字符串时,我可以轻松地进行映射。而且我可以正确调用它。
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
我的代码:
public string callRestAPI()
{
var request = (HttpWebRequest)WebRequest.Create("https://jsonplaceholder.typicode.com/posts/2");
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
var response =(HttpWebResponse)request.GetResponse();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string content = string.Empty;
using (var stream = response.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
return content = sr.ReadToEnd();
}
}
throw new Exception($"api data is {content}");
}
.. 映射
public class RootObject
{
public int userId { get; set; }
public int id { get; set; }
public string title { get; set; }
public string body { get; set; }
}
..现在我如何称呼它的示例
string Consume = callRestAPI();
var Accs = JsonConvert.DeserializeObject<RootObject>(Consume);
try
{
Entity createcontact = new Entity("contact");
createcontact["firstname"] = "Joe";
createcontact["lastname"] = Accs.title;
createcontact["emailaddress1"] = "Joe.doe@gmail.com";
但是当我得到这种类型的字符串时,我对它感到困惑,而且我似乎无法正确地调用它。当我必须从第一个字符串 API 获取数据时,我的代码有效,但是当我更改为第二个 API 产生以下字符串时,我的代码不起作用,我只是感到困惑。
{
"data": {
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
}
}
您的第一个 json 片段:
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
... 正确映射到 RootObject
class.
但是,您的第二个 json 代表 层级 :
{
"data": {
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
}
}
... 有根对象,然后是 data
对象,所以它不能映射到 RootObject
(所以从语义上讲,它不应该被称为“RootObject"。
所以你有两个选择:
只需添加代表该层次结构的 class:
public class Response { public RootObject data { get; set; } }
... 然后:
JsonConvert.DeserializeObject<Response>(json);
或者,select 嵌套对象 json 仅:
string dataJson = JObject.Parse(json).SelectToken("data").ToString(); var data = JsonConvert.DeserializeObject<RootObject>(dataJson);