如何将JSON值保持为String?

时间:2015-07-13 19:19:33

标签: c# json serialization

这是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 方法。

2 个答案:

答案 0 :(得分:4)

由于您不介意使用其他库,我建议使用NewtonSoft JSON.NET。那里有一些类(JObjectJArray等),它们可以将任意JSON数据表示为某些强类型对象的一部分。我正在使用它来反序列化一些大型JSON,其中只有一小部分对我很有意思。我可以反序列化整个JSON,修改重要的部分并序列化,保持不相关的部分不受影响。

以下是将children作为字符串的代码示例,即使它是JSON中的数组。重要的是您可以修改其他字段(namehome)的内容并将整个序列序列化,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,并添加虚拟属性。

enter image description here

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