如何将JSON值保留为字符串?

8

这是 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

我只想将孩子们记录/序列化为字符串,而不是Child。这意味着我只想保留这一部分:[{"name":"Belle"},{"name":"O"}] 作为STRING,而不是Array/List。

我该怎么做?我正在使用 DataContractJSONSeriliazer.ReadObject 方法。


我无法帮助你处理DataContractJSONSeriliazer,但我有类似的需求(保留JSON的某些部分)使用Newtonsoft JSON.net。在那里,我可以使用JObjectJArray类作为序列化目标,以保留字段为纯JSON。也许你可以找到类似的东西。 - Kuba Wyrostek
请看看这个链接能否对你有所帮助:https://msdn.microsoft.com/zh-cn/library/bb943471(v=vs.110).aspx - Kuba Wyrostek
移除子项作为序列化候选项,添加一个名为childrenstring或类似名称的新属性,使得childrenstring的获取属性返回子项列表中的字符串。 - Travis J
@KubaWyrostek,我不介意使用不同的库,有JSON.net的示例代码吗?也许我更喜欢将字段保持为纯JSON。谢谢!哦,你的第二个建议链接并不完全符合我的需求,因为我必须解析子项。我不需要解析子项。 - Chris Lists
@EZI,您的评论让我感到困惑。请提供代码或链接。 :) - Chris Lists
显示剩余4条评论
2个回答

6
由于您不介意使用另一个库,我建议使用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"}]
    }
}

完美!正是我所寻找的。标记为答案。 - Chris Lists

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

感谢您的贡献。另一个答案在这种情况下对我非常有效。我希望其他人也会发现您的答案有用。 - Chris Lists
我很高兴你搞明白了。说实话,我比起我的回答更喜欢Kuba Wyrostek的回答。 - Win

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