如何在C#中将JObject转换为object?

3

我有一个类似如下的JObject对象:

JObject obj = new JObject();
obj.Add(new JProperty("Name","Olivier"));
obj.Add(new JProperty("Surname","Big"));
obj.Add(new JProperty("FatherName","Johnatan"));

我希望将上面的 obj 转换为 object

如果我使用以下代码:

var result1 = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(obj.ToString());

结果如下所示 Img1

但是期望的结果应该像下面这样

var TheResultIWant = new { Name = "Olivier", Surname = "Big", FatherName = "Johnatan" };

Img2

我该如何获取第二张图片中的对象?因为我不知道属性名称,所以无法像它那样编写代码。


1
JObject 已经是一个对象。它也是一个动态对象,这意味着您可以像使用匿名类型一样使用它。如果您想将JSON字符串反序列化为特定类型,请将该类型传递给DeserializeObject。您无法反序列化为匿名类型。 - Panagiotis Kanavos
1
如果您使用 dynamic TheResultIWant = obj;,则可以按名称检索属性,例如 var name=TheResultIWant.Name; - Panagiotis Kanavos
1
同时,如果您能解释为什么需要以这种方式工作以及使用对象的代码是什么,那将非常有帮助。 - Fabjan
我不知道属性名称。那么你就不能使用匿名类型。你知道什么,并且你尝试如何使用该对象?如果你不知道该属性,那么你如何检索它呢? - Panagiotis Kanavos
CustomContext d = new CustomContext(); List<ReportField> myList = d.ReportFields.ToList();JObject obj = new JObject(); foreach (var item in myList) { obj.Add(new JProperty(item.PropertName, item.PropertyValue)); }var result1 = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(obj.ToString());var TheResultIWant = new { Name = "Olivier", Surname = "Big", FatherName = "Johnatan" }; - NSkao
显示剩余4条评论
2个回答

3

好的,你可以使用DeserializeAnonymousType方法:

    JObject obj = new JObject();
    obj.Add(new JProperty("Name", "Olivier"));
    obj.Add(new JProperty("Surname", "Big"));
    obj.Add(new JProperty("FatherName", "Johnatan"));

    var result = new
    {
        Name = "",
        Surname = "",
        FatherName = ""
    };
    result  = JsonConvert.DeserializeAnonymousType(obj.ToString(), result);

另一种选择是使用 dynamic,而迄今为止最常用的第三种选项是创建自己的类型并使用它:
public class Person 
{
   public string Name { get; set; }
   ...
}

Person result = JsonConvert.DeserializeObject<Person>(obj.ToString());

我不知道匿名类型。类型的属性来自数据库。我需要使用传入的属性创建一个对象。结果如图2所示。 - NSkao
@NSkao,但这并不是你在问题中所问的。真正的问题是什么?如果您不知道类型,为什么不直接使用JObject呢? - Panagiotis Kanavos
是的,那将是另一个问题。在您的Img2示例中,您可以看到具有3个属性的匿名对象。 - Fabjan
当我渲染 JObject 时,我想要得到结果 2。 - NSkao
@NSkao 那里没有渲染代码。你发布的是匿名类型。要创建匿名类型,首先需要知道要包含哪些属性。 - Panagiotis Kanavos
1
匿名类型仍然是一种类型,它需要被编译。Newtonsoft 库不会创建这样的自定义类型,它可以填充现有类型的实例,但不会创建自定义类型。你在什么情况下使用生成的类型呢? - Lasse V. Karlsen

3

JObject是一个已经反序列化的对象。它可以被用作动态对象,所以不需要将其序列化为字符串并获取另一个对象。

dynamic TheResultIWant = obj; 
var name=TheResultIWant.Name;

已经可以通过key访问属性,就像使用字典一样:

var name=obj["Name"];

这将返回一个JToken。如果已知值的类型,可以使用Value<T>Values<T>来检索它:

var name=obj["Name"].Value<string>();

这是正确的答案。我曾经用这种方式做过,但忘记了我是如何做的。没有必要反序列化任何东西。 - Mayron
唯一的问题是,似乎Value<>无法返回任何非基元类型。 - Cool guy

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