在 C# 中使用数字字符串键反序列化 JSON
Deserializing JSON with numeric string keys in C#
{
Items: [
{
"title": "Object1",
"preview": {
"2048": "preview_9212.jpg",
"1024": "preview_6693.jpg",
}
},
{
"title": "Object2",
"preview": {
"2048": "preview_9888.jpg",
"1024": "preview_6890.jpg",
}
},
{
"title": "Object3",
"preview": {
"2048": "preview_9822.jpg",
"1024": "preview_6848.jpg",
}
}
]
}
我通常这样反序列化:
[Serializable]
public class JsonParser
{
public string title;
public List<Preview> preview;
}
[Serializable]
class Preview
{
public string 2048;
}
但是因为2048是一个Integer是不可能使用这种方式的。
我尝试反序列化 JSON 以获得如下预览:
public class Preview
{
[JsonProperty("2048")]
public string imageNumber { get; set; }
}
var user = JsonConvert.DeserializeObject<Preview>(jsonValue);
或
var json = JObject.Parse(jsonValue);
var preview = json["preview"].ToObject<Dictionary<string, string>>();
foreach (var entry in preview)
{
Debug.Log(entry.Key);
Debug.Log(entry.Value);
}
我得到:NullReferenceException:对象引用未设置到对象的实例。
我也试过 Deserializing JSON that has an int as a key in C# 但还是 NullReferenceException;
感谢您的帮助!
由于您有数字字符串属性,您有 2 个主要选择:
为 属性
使用 [JsonProperty("2048")] 和 select 之类的有效名称
或者用字典。这对我来说看起来更灵活,所以你可以试试这个代码
Data data= JsonConvert.DeserializeObject<Data>(json);
string preview2048 = data.Items[0].Preview["2048"]; //preview_9212.jpg
或使用 Linq 进行更复杂的搜索
string obj3Preview2048 = data.Items.Where(i=> i.Title == "Object3")
.Select(i =>i.Preview["2048"]).FirstOrDefault(); //preview_9822.jpg
类
public partial class Data
{
[JsonProperty("Items")]
public List<Item> Items { get; set; }
}
public partial class Item
{
[JsonProperty("title", NullValueHandling = NullValueHandling.Ignore)]
public string Title { get; set; }
[JsonProperty("token")]
public string Token { get; set; }
[JsonProperty("preview")]
public Dictionary<string, string> Preview { get; set; }
}
并且您在 json 中有一些拼写错误,我将其中一个 json 对象中的“type”修正为“title”。这是固定版本
{
"Items": [{
"title": "Object1",
"token": "6561b1bbe5f1958848jhgd43d2",
"preview": {
"2048": "preview_9212.jpg",
"1024": "preview_6693.jpg"
}
},
{
"title": "Object2",
"token": "4a42eb54648DSFhUI664654d25",
"preview": {
"2048": "preview_9888.jpg",
"1024": "preview_6890.jpg"
}
},
{
"type": "Object3",
"token": "3fba64831dghkjgfkl5dfaegoj9",
"preview": {
"2048": "preview_9822.jpg",
"1024": "preview_6848.jpg"
}
}
]
}
{
Items: [
{
"title": "Object1",
"preview": {
"2048": "preview_9212.jpg",
"1024": "preview_6693.jpg",
}
},
{
"title": "Object2",
"preview": {
"2048": "preview_9888.jpg",
"1024": "preview_6890.jpg",
}
},
{
"title": "Object3",
"preview": {
"2048": "preview_9822.jpg",
"1024": "preview_6848.jpg",
}
}
]
}
我通常这样反序列化:
[Serializable]
public class JsonParser
{
public string title;
public List<Preview> preview;
}
[Serializable]
class Preview
{
public string 2048;
}
但是因为2048是一个Integer是不可能使用这种方式的。 我尝试反序列化 JSON 以获得如下预览:
public class Preview
{
[JsonProperty("2048")]
public string imageNumber { get; set; }
}
var user = JsonConvert.DeserializeObject<Preview>(jsonValue);
或
var json = JObject.Parse(jsonValue);
var preview = json["preview"].ToObject<Dictionary<string, string>>();
foreach (var entry in preview)
{
Debug.Log(entry.Key);
Debug.Log(entry.Value);
}
我得到:NullReferenceException:对象引用未设置到对象的实例。
我也试过 Deserializing JSON that has an int as a key in C# 但还是 NullReferenceException;
感谢您的帮助!
由于您有数字字符串属性,您有 2 个主要选择:
为 属性
使用 [JsonProperty("2048")] 和 select 之类的有效名称或者用字典。这对我来说看起来更灵活,所以你可以试试这个代码
Data data= JsonConvert.DeserializeObject<Data>(json);
string preview2048 = data.Items[0].Preview["2048"]; //preview_9212.jpg
或使用 Linq 进行更复杂的搜索
string obj3Preview2048 = data.Items.Where(i=> i.Title == "Object3")
.Select(i =>i.Preview["2048"]).FirstOrDefault(); //preview_9822.jpg
类
public partial class Data
{
[JsonProperty("Items")]
public List<Item> Items { get; set; }
}
public partial class Item
{
[JsonProperty("title", NullValueHandling = NullValueHandling.Ignore)]
public string Title { get; set; }
[JsonProperty("token")]
public string Token { get; set; }
[JsonProperty("preview")]
public Dictionary<string, string> Preview { get; set; }
}
并且您在 json 中有一些拼写错误,我将其中一个 json 对象中的“type”修正为“title”。这是固定版本
{
"Items": [{
"title": "Object1",
"token": "6561b1bbe5f1958848jhgd43d2",
"preview": {
"2048": "preview_9212.jpg",
"1024": "preview_6693.jpg"
}
},
{
"title": "Object2",
"token": "4a42eb54648DSFhUI664654d25",
"preview": {
"2048": "preview_9888.jpg",
"1024": "preview_6890.jpg"
}
},
{
"type": "Object3",
"token": "3fba64831dghkjgfkl5dfaegoj9",
"preview": {
"2048": "preview_9822.jpg",
"1024": "preview_6848.jpg"
}
}
]
}