我有像下面的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);
但序列化后我得到空值,我怎么解决这个问题?
答案 0 :(得分:15)
正如其他人已经指出的那样,您没有得到预期结果的原因是因为您的JSON与您尝试反序列化的类结构不匹配。您需要更改JSON或更改类。由于其他人已经展示了如何更改JSON,我将采取相反的方法。
要匹配您在问题中发布的JSON,您的类应定义如下。请注意,我做了以下更改:
Wrapper
类。Values
类的ValueSet
属性从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
类。然后,您可以从ValueSet
获取Wrapper
。
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
答案 1 :(得分:7)
我发现上面的链接非常有用,因为它通过从实际返回的JSON生成它们来纠正我的C#类。
然后我打电话给:
JsonConvert.DeserializeObject<RootObject>(jsonString);
一切都按预期工作。
答案 2 :(得分:2)
您的数据结构和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中的{ .. }
定义了一个对象,其中[ .. ]
定义了一个数组。因此,根据您的JSON,您没有一堆值,但是您拥有one
个值对象,其属性value1
和value2
类型为Value
。
由于反序列化程序需要一个数组但却得到一个对象,它可以做的事情是做到最少的非破坏性(Exception):跳过该值。您的媒体资源values
仍保留默认值:null
。
如果可以:调整您的JSON。以下内容符合您的数据结构,很可能是您真正想要的:
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1"
}, {
"id": "200",
"diaplayName": "MyValue2"
}
]
}
答案 3 :(得分:1)
你检查这条线是否完美无缺;你的字符串有价值吗?
string jsonString = sr.ReadToEnd();
如果是,请在最后一行尝试此代码:
ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);
或者如果你有一个json数组,你可以使用这样的列表:
List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);
答案 4 :(得分:0)
你有一个不匹配的jSon字符串,如果你想转换成一个列表,试试这个
{
"id": "MyID",
"values": [
{
"id": "100",
"diaplayName": "MyValue1",
},
{
"id": "200",
"diaplayName": "MyValue2",
}
]
}
答案 5 :(得分:0)
这也是可能的:
using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);
答案 6 :(得分:0)
Json转换为C#类= https://json2csharp.com/json-to-csharp
架构出现后
.exe
我们最大的错误之一是我们无法将类结构与json匹配。
此连接将自动执行该过程。您稍后将进行编码;)= https://json2csharp.com/json-to-csharp
就是这样。
答案 7 :(得分:-4)
您可以使用Json.Net框架来执行此操作。 就像这样:
Account account = JsonConvert.DeserializeObject<Account>(json);