gpt4 book ai didi

c# - 在 MVC 中反序列化 JSON

转载 作者:行者123 更新时间:2023-12-03 04:43:03 27 4
gpt4 key购买 nike

我是 .NET 和 MVC 的新手。努力将一些 JSON 反序列化为 ViewBag 中的对象。 JSON 来自 Azure 搜索。我已经验证了 WebHttpRequest 返回 JSON,如下所示:

{
"@odata.context": "https://url.toazuresearch/indexes('index01')/$metadata#docs",
"value": [
{
"@search.score": 0.31507686,
"Id": "34",
"Date": "2017-08-24T09:14:56.193Z",
"Domain": "domain.com",
"RuleName": "Legacy Reports",
"Log": "Log text",
"ChangeId": "changeId",
"ParentId": "0",
"Comments": "Comments"
},
{
"@search.score": 0.2553736,
"Id": "35",
"Date": "2017-08-24T09:14:56.193Z",
"Domain": "domain.com",
"RuleName": "Legacy Reports",
"Log": "Log text",
"ChangeId": "changeId",
"ParentId": "0",
"Comments": "Comments"
}
]
}

我的类(class)是这样的:

[DataContract]
public class SearchResult
{
[DataMember]
public float SearchScore { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public string Domain { get; set; }
[DataMember]
public string RuleName { get; set; }
[DataMember]
public string Log { get; set; }
[DataMember]
public string ChangeId { get; set; }
[DataMember]
public string ParentId { get; set; }
[DataMember]
public string Comments { get; set; }
}

我在 Controller 中处理响应的代码:

try
{
WebResponse response = request.GetResponse();
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);

DataContractJsonSerializer serializer =
new DataContractJsonSerializer(typeof(IEnumerable<SearchResult>));
var results =
(IEnumerable<SearchResult>)serializer.ReadObject(responseStream);

ViewBag.SearchResults = results;
}
}
catch (WebException ex)
{
WebResponse errorResponse = ex.Response;
using (Stream responseStream = errorResponse.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
ViewBag.SearchError = reader.ReadToEnd();
ViewBag.SearchResults = "0 Results";

}
throw;
}

最后,我尝试在我的 View 中循环显示结果:

@foreach (var searchResult in ViewBag.SearchResults)
{
@searchResult.Id <br />
}

我刚刚得到一个空白页面。我在VS中测试时没有异常(exception)。

最佳答案

使用Json.Net而不是 DataContractJsonSerializer 更容易。

首先你的模型:

public class Value
{
[JsonProperty("@search.score")]
public double SearchScore { get; set; }
public string Id { get; set; }
public string Date { get; set; }
public string Domain { get; set; }
public string RuleName { get; set; }
public string Log { get; set; }
public string ChangeId { get; set; }
public string ParentId { get; set; }
public string Comments { get; set; }
}

public class RootObject
{
[JsonProperty("@odata.context")]
public string Contextcontext { get; set; }
public List<Value> value { get; set; }
}

序列化代码:

var result = JsonConvert.DeserializeObject<RootObject>(reader.ReadToEnd());

编辑

如果您确实想使用DataContractJsonSerializer方式,您的模型将是

[DataContract]
public class SearchResult
{
[DataMember(Name = "@search.score")]
public float SearchScore { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public string Domain { get; set; }
[DataMember]
public string RuleName { get; set; }
[DataMember]
public string Log { get; set; }
[DataMember]
public string ChangeId { get; set; }
[DataMember]
public string ParentId { get; set; }
[DataMember]
public string Comments { get; set; }
}

[DataContract]
public class RootObject
{
[DataMember(Name = "@odata.context")]
public string Context { get; set; }
[DataMember]
public List<SearchResult> value { get; set; }
}

您的序列化代码(请参阅日期时间处理代码)

var settings = new DataContractJsonSerializerSettings()
{
DateTimeFormat = new DateTimeFormat(@"yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture)
};
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RootObject),settings);

var results = (RootObject)serializer.ReadObject(responseStream);

关于c# - 在 MVC 中反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com