[英]How to convert Json array to list of objects in c#
我有像下面这样的 Json 字符串
{
"JsonValues":{
"id": "MyID",
"values": {
"value1":{
"id": "100",
"diaplayName": "MyValue1"
},
"value2":{
"id": "200",
"diaplayName": "MyValue2"
}
}
}
}
我想将 Json 字符串转换为以下类
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
}
class Value
{
public string id
{
get;
set;
}
public string DiaplayName
{
get;
set;
}
}
我的反序列化代码是
JavaScriptSerializer js = new JavaScriptSerializer();
StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
string jsonString = sr.ReadToEnd();
var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
但是序列化后我得到了空值,我该如何解决这个问题?
正如其他人已经指出的那样,您没有获得预期结果的原因是您的 JSON 与您尝试反序列化的类结构不匹配。 您需要更改 JSON 或更改您的类。 由于其他人已经展示了如何更改 JSON,因此我将在此处采用相反的方法。
为了匹配您在问题中发布的 JSON,您的类应该像下面那样定义。 请注意,我进行了以下更改:
Wrapper
类。ValueSet
类的Values
属性从List<Value>
更改为Dictionary<string, Value>
因为 JSON 中的values
属性包含一个对象,而不是数组。[JsonProperty]
属性来匹配 JSON 对象中的属性名称。类定义:
class Wrapper
{
[JsonProperty("JsonValues")]
public ValueSet ValueSet { get; set; }
}
class ValueSet
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("values")]
public Dictionary<string, Value> Values { get; set; }
}
class Value
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("diaplayName")]
public string DisplayName { get; set; }
}
您需要反序列化为Wrapper
类,而不是ValueSet
类。 然后,您可以从Wrapper
获取ValueSet
。
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
这是一个工作程序来演示:
class Program
{
static void Main(string[] args)
{
string jsonString = @"
{
""JsonValues"": {
""id"": ""MyID"",
""values"": {
""value1"": {
""id"": ""100"",
""diaplayName"": ""MyValue1""
},
""value2"": {
""id"": ""200"",
""diaplayName"": ""MyValue2""
}
}
}
}";
var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Console.WriteLine("id: " + valueSet.Id);
foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
{
Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
}
}
}
这是输出:
id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
我发现上面的链接非常有用,因为它通过从实际返回的 JSON 生成它们来纠正我的 C# 类。
然后我打电话给:
JsonConvert.DeserializeObject<RootObject>(jsonString);
一切都按预期进行。
您是否检查过这条线是否完美运行并且您的字符串在其中有价值?
string jsonString = sr.ReadToEnd();
如果是,请在最后一行尝试此代码:
ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
或者如果你有一个 json 数组,你可以使用这样的列表:
List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);
祝你好运
您的数据结构和您的 JSON 不匹配。
你的 JSON 是这样的:
{
"JsonValues":{
"id": "MyID",
...
}
}
但是您尝试将其序列化为的数据结构是这样的:
class ValueSet
{
[JsonProperty("id")]
public string id
{
get;
set;
}
...
}
您正在跳过一个步骤:您的 JSON 是一个具有名为JsonValues
属性的类,该属性具有您的ValueSet
数据结构的对象作为值。
同样在你的课堂上,你的 JSON 是这样的:
"values": { ... }
你的数据结构是这样的:
[JsonProperty("values")]
public List<Value> values
{
get;
set;
}
请注意,JSON 中的{ .. }
定义了一个对象,而 as [ .. ]
定义了一个数组。 因此,根据您的 JSON,您没有一堆值,但您有one
values 对象,其属性value1
和value2
的类型为Value
。
由于反序列化器需要一个数组,但获取的是一个对象,因此它会做它可以做的最少非破坏性(异常)的事情:跳过该值。 您的属性values
保持其默认值: null
。
如果可以:调整您的 JSON。 以下将匹配您的数据结构,并且很可能是您真正想要的:
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1"
}, {
"id": "200",
"diaplayName": "MyValue2"
}
]
}
Json 转换为 C# 类 = https://json2csharp.com/json-to-csharp
模式出来后
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
string myJSON = client.DownloadString("http://xxx/xx/xx.json");
var valueSet = JsonConvert.DeserializeObject<Root>(myJSON);
我们最大的错误之一是我们无法将类结构与 json 匹配。
此连接将自动执行此过程。 您稍后将对其进行编码;) = https://json2csharp.com/json-to-csharp
就是这样。
你有一个不匹配的 json 字符串,如果你想转换成一个列表,试试这个
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1",
},
{
"id": "200",
"diaplayName": "MyValue2",
}
]
}
这也是可能的:
using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);
这需要 JsonElement 并将其反序列化为对象列表。
List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());
例子:
[HttpPost]
[Route("CreateDraft")]
public async Task<IActionResult> CreateDraft([FromBody] JsonElement jsonDrafts)
{
List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());
for (int i = 0; i < draftInvoices.Count; i++)
{
........
}
您可以使用 Json.Net 框架来执行此操作。 像这样 :
Account account = JsonConvert.DeserializeObject<Account>(json);
主页: http : //json.codeplex.com/
关于这个的文件: http : //james.newtonking.com/json/help/index.html#
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.