C#Json.net将嵌套的json反序列化为字符串

时间:2018-10-28 07:17:18

标签: c# json json.net

我有以下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);反序列化时,出现以下错误:

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: {. 

3 个答案:

答案 0 :(得分:4)

因为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; }
}

注意

有两种方法可以轻松地创建模型。

  1. 您可以在Visual Studio中使用Web Essentials,将Edit > Paste special > paste JSON作为类,可以更轻松地了解Json与模型之间的关系。

  2. 如果您不能使用Web Essentials,则可以代替使用http://json2csharp.com/在线JSON到Model类。

您可以尝试使用这些模型来携带JSON格式。

答案 1 :(得分:4)

"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);

答案 2 :(得分:2)

好吧,如果任务是在将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" }