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

3

我有以下的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个回答

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转换为模型类。

您可以尝试使用这些模型来处理您的JSON格式。


谢谢,但我需要将它保留为字符串,而不是另一个模型类。 - Develope Cruz
这是因为每次调用prop3的内容/结构都不同。 - Develope Cruz
但是你的 property3 是一个 JSON 对象而不是一个字符串。关于 content/structure of prop3 is different for every call. 你的意思是什么? - D-Shih
Json是从Web服务返回的,prop3是我请求的对象。它可以是客户、订单、文档等等... - Develope Cruz
@DevelopeCruz 我认为如果prop3返回复杂模型,你不能使用“string”来传递它。 - D-Shih
显示剩余2条评论

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

1
但是,我需要将prop3保留为字符串,而不是另一个模型的“神奇”类。 - Develope Cruz
这是因为每次调用prop3的内容/结构都不同。 - Develope Cruz
这是一个非常有趣的方法。谢谢,我会考虑一下。 - Develope Cruz

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

第二步:将对象反序列化为对象字典:
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json_string);
Console.WriteLine(dict["property3"].ToString());

两者输出结果相同:

{ "subprperty1": "value" }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接