这是JSON字符串:
{"name":"Chris","home":[],"children":[{"name":"Belle"},{"name":"O"}]}
我通常会像这样创建自定义对象:
public class Child
{
public string name { get; set; }
}
public class RootObject
{
[DataMember]
public string name { get; set; }
[DataMember]
public List<object> home { get; set; }
[DataMember]
public List<Child> children { get; set; }
}
但现在我不希望孩子为 List ,
我只想将子项记录/序列化为String,而不是Child。这意味着我只是不介意保留这部分: [{“name”:“Belle”},{“name”:“O”}] 为STRING,而不是数组/列表。
我该怎么做?我正在使用 DataContractJSONSeriliazer.ReadObject 方法。
答案 0 :(得分:4)
由于您不介意使用其他库,我建议使用NewtonSoft JSON.NET。那里有一些类(JObject
,JArray
等),它们可以将任意JSON数据表示为某些强类型对象的一部分。我正在使用它来反序列化一些大型JSON,其中只有一小部分对我很有意思。我可以反序列化整个JSON,修改重要的部分并序列化,保持不相关的部分不受影响。
以下是将children
作为字符串的代码示例,即使它是JSON中的数组。重要的是您可以修改其他字段(name
和home
)的内容并将整个序列序列化,JSON输出中的children
将保留为包含原始内容的数组。
假设
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
这里是代码示例:
public class RootObject
{
public string name;
public List<object> home;
public JArray children; // I don't care what children may contain
}
class Program
{
static void Main(string[] args)
{
string sourceJSON =
@"{""name"":""Chris"",""home"":[],""children"":[{""name"":""Belle""},{""name"":""O""}]}";
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(sourceJSON);
string partAsString = rootObject.children.ToString(Formatting.None);
// partAsString is now: [{"name":"Belle"},{"name":"O"}]
}
}
答案 1 :(得分:1)
根据我对您的问题的理解,您可以使用Json.Net,并添加虚拟属性。
internal class Program
{
private static void Main(string[] args)
{
string json = "{\"name\":\"Chris\",\"home\":[],\"children\":[{\"name\":\"Belle\"},{\"name\":\"O\"}]}";
RootObject result = JsonConvert.DeserializeObject<RootObject>(json);
Console.ReadLine();
}
}
public class Child
{
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
public class RootObject
{
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "home")]
public List<object> Home { get; set; }
[JsonProperty(PropertyName = "children")]
public List<Child> ChildrenCollection { get; set; }
[JsonIgnore]
public string Children
{
get
{
// You can format the result the way you want here.
return string.Join(",", ChildrenCollection.Select(x => x.Name));
}
}
}