[英]C# Json.net deserialize nested json as string
我有以下json字符串
{
"property1" : "value",
"property2" : 2,
"property3" : { "subprperty1" : "value" }
}
我想反序列化它(使用Newtonsoft的Json.net),但将property3保留为字符串。
所以我创建了以下模型类
class JsonModel {
string property1 {get; set;}
int property2 {get; set;}
string property3 {get; set;}
}
但是当我使用JsonConvert.DeserializeObject<JsonModel>(json_string);
反序列化它时JsonConvert.DeserializeObject<JsonModel>(json_string);
我收到以下错误:
Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: {.
因为property3
是一个对象而不是一个字符串。
您可以尝试使用类来执行它。
public class Property3
{
public string subprperty1 { get; set; }
}
public class JsonModel
{
public string property1 { get; set; }
public int property2 { get; set; }
public Property3 property3 { get; set; }
}
注意
有两种方法可以轻松创建模型。
您可以在Visual Studio中使用Web Essentials,使用Edit > Paste special > paste JSON
作为类,您可以更轻松地了解Json和模型之间的关系。
如果您无法使用Web Essentials,则可以使用http://json2csharp.com/在线JSON到Model类。
您可以尝试使用这些模型来携带JSON格式。
"property3" : { "subprperty1" : "value" }
这不是嵌套的json ,它只是一个标准的json对象
更新
从你的评论,我认为你想要一个通用的财产。 如果您的用例事先知道回来的内容,并且有一些子集正在发生变化,那么泛型可能就是您应该在哪里
所以你可以用标准的方式反序列化它
class JsonModel<T>
{
string property1 {get; set;}
int property2 {get; set;}
T property3 {get; set;}
}
class SomeOtherMagicalClass
{
string subprperty1 {get; set;}
}
...
var results = JsonConvert.DeserializeObject<JsonModel<SomeOtherMagicalClass>>(json_string);
好吧,如果任务是反序列化对象,同时保留property3
为json字符串,我们可以做两件事。
第一:使用JObject.Parse
解析对象:
class JsonModel {
public string property1 { get; set; }
public int property2 { get; set; }
public string property3 { get; set; }
}
var json_string = "{ \"property1\" : \"value\", \"property2\" : 2, \"property3\" : { \"subprperty1\" : \"value\" } }";
var jObj = JObject.Parse(json_string);
var obj = new JsonModel()
{
property1 = jObj["property1"].ToString(),
property2 = (int) jObj["property2"],
property3 = jObj["property3"].ToString(),
};
Console.WriteLine(obj.property3);
第二步:将obj反序列化为对象字典:
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json_string);
Console.WriteLine(dict["property3"].ToString());
两者输出相同:
{ "subprperty1": "value" }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.