如何在c#中反序列化JSON数组
本文关键字:反序列化 JSON 数组 | 更新日期: 2023-09-27 18:03:37
我正在努力在这个论坛上有很多变体,但我似乎找不到一个适合我的主题,我认为这是因为我的JSON数组的方式:(我不是专家,但我已经设法"几乎"得到结束…我需要得到手在"状态"answers"listOfCredDetails"值。
我的JSON(被称为responseFromServer):
{
"Status": {
"StatusCode":143,
"SubStatus":0,
"Description":"Ok"
},
"ListofCredDetails":
[{
"Client":"a",
"CredID":111,
"CredUserID":"abc"
},
{
"Client":"b",
"CredID":112,
"CredUserID":"def"
},
{
"Client":"c",
"CredID":113,
"CredUserID":"ghi"
}]
}
然后,根据这个论坛上的许多例子,取一些零碎的东西,我创建了我的类:
[Serializable]
public class StatusReturn
{
public int StatusCode { get; set; }
public int SubStatus { get; set; }
public string Description { get; set; }
}
[Serializable]
public class CredDetailsReturn
{
public string Client{ get; set; }
public int CredID{ get; set; }
public string CredUserID{ get; set; }
}
[Serializable]
public class GetUserCredentialDetailsReturn
{
public StatusReturn status;
public List<CredDetailsReturn> listOfCredDetails;
public GetUserCredentialDetailsReturn()
{
status = new StatusReturn();
listOfCredDetails = new List<CredDetailsReturn>();
}
}
然后反序列化得到
1。"Status"和它的元素组成一个对象和
2。"ListofCredDetails"和它的元素列表到一个对象
,然后为"GetUserCredentialDetailsReturn"创建对象,以同时返回状态(对象)和ListofCredDetails(对象)。
谁能帮助我理解我如何才能实现这一点,我已经尝试了一些像下面的反序列化,并得到Json数据成两个独立的对象。
但是不工作....
public GetUserCredentialDetailsReturn InvokeRequest(RESTInvokeClass objInvoke)
{
...
...
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
string responseText = streamReader.ReadToEnd();
GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn();
result.status = JsonConvert.DeserializeObject<StatusReturn>(responseText);
result.listOfCredDetails = JsonConvert.DeserializeObject<List<CredDetailsReturn>>(responseText);
return result;
}
}
您需要首先将类GetUserCredentialDetailsReturn
中的属性名称更改为status和listOfCredDetails。
然后你可以尝试用下面的代码将Json反序列化到你的类GetUserCredentialDetailsReturn
中。
GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn();
result = JsonConvert.DeserializeObject<GetUserCredentialDetailsReturn>(responseText);
您可以在结果中获得您的状态和listOfCredDetails。
// result.Status
// result.ListofCredDetails
[Serializable]
public class GetUserCredentialDetailsReturn
{
public StatusReturn status { get; set; }
public List<CredDetailsReturn> listOfCredDetails { get; set; }
}
JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string)
如果你只需要一个JSON文件的一些孤立的元素(比如非常大),你需要JSON库的较低级别部分,例如Newtonsoft:
using Newtonsoft.Json;
然后创建一个解析器来读取JSON token:
var reader = new JsonTextReader(...);
你会得到一个一个的token:
private void nextToken()
{
do
{
if (!reader.Read()) this.importError("unexpected end of file");
}
while (reader.TokenType == JsonToken.Comment);
}
并且必须在Token Parser中处理它。例如,如果你读取一个数组:
private void readMyArray()
{
// StartArray
if (reader.TokenType != JsonToken.StartArray) this.importError("expected start of array '['");
this.nextToken();
while (reader.TokenType != JsonToken.EndArray)
{
this.readMyElement();
}
// EndArray
if (reader.TokenType != JsonToken.EndArray) this.importError("expected end of array ']'");
this.nextToken();
}
这个技术在每一本关于构建编译器的书中都有解释