我有如下所示的 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,您的类应按如下所示定义。 请注意,我进行了以下更改:
- 我在 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
http://json2csharp.com/
我发现上面的链接非常有用,因为它通过从实际返回的 JSON 生成它们的 C# 类来纠正我的 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
值对象,其属性为 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#