我以这种格式从第三方Web服务返回json。是#39;有点担心它对一些对象的反序列化。什么应该是我的模型结构?
{"123":{"Name":"test1","Address":"add 1"}
,"1412":{"Name":"test2","Address":"add 2"}
,"4123":{"Name":"test3","Address":"add 3"}}
答案 0 :(得分:1)
public class __invalid_type__123
{
public string Name { get; set; }
public string Address { get; set; }
}
public class __invalid_type__1412
{
public string Name { get; set; }
public string Address { get; set; }
}
public class __invalid_type__4123
{
public string Name { get; set; }
public string Address { get; set; }
}
public class RootObject
{
public __invalid_type__123 __invalid_name__123 { get; set; }
public __invalid_type__1412 __invalid_name__1412 { get; set; }
public __invalid_type__4123 __invalid_name__4123 { get; set; }
}
我是使用json2csharp工具获得的。你会注意到C#类型不能以数字开头,所以他们得到了#34;无效类型"先于他们。但随时随地重命名它们。这应该让你开始了结构。
我知道你无法控制JSON,但它似乎是一个糟糕的格式选择。您有三种基本相同的类型。他们应该使用一个数组。然后它会变得更简单。
答案 1 :(得分:0)
Thanx @mason你给我一个发现的线索。我终于找到了一个解决方案......我想我也应该和你分享它。
回答我的问题:
var jobj = (JObject)JsonConvert.DeserializeObject(json);
var items = jobj.Children()
.Cast<JProperty>()
.Select(j=>new
{
Id=j.Name,
Name= (string)j.Value["Name"],
Address= (string)j.Value["Address"]
})
.ToList();
答案 2 :(得分:0)
使用Json.Net即可:
public class NameAddress
{
public string Name { get; set; }
public string Address { get; set; }
}
public class RootObject
{
[JsonProperty("123")]
public NameAddress { get; set; }
[JsonProperty("1412")]
public NameAddress { get; set; }
[JsonProperty("4123")]
public NameAddress { get; set; }
}
答案 3 :(得分:0)
我知道这是旧的,但对于那些寻找答案的人我有一个解决方案。使用Json.Net我通过将结构反序列化为带有字符串键和对象值的字典来破解这个坚果。解决方案是这样的:
public class Item {
public string Name { get; set; }
public string Address { get; set; }
}
Dictionary<string, Item> itemList =
JsonConvert.DeserializeObject<Dictionary<string, Item>>( myJsonString );
我验证了上面的代码适用于您的示例。如果您不能保证项目名称(或结果字典中的键)不唯一,您可以使用Json.Net支持的其他类型的集合。