【问题标题】:How to keep JSON value as String?如何将 JSON 值保存为字符串?
【发布时间】:2015-07-13 19:19:32
【问题描述】:

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

但现在我不想让孩子成为列表

我只想将孩子记录/序列化为字符串,而不是孩子。这意味着我只是不介意保留这部分:[{"name":"Belle"},{"name":"O"}] 作为字符串,而不是数组/列表。 p>

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

【问题讨论】:

  • 我无法为您提供DataContractJSONSeriliazer 的帮助,但我对 Newtonsoft JSON.net 也有类似的需求(保持 JSON 的某些部分不变)。在那里,我可以使用JObjectJArray 类作为序列化目标来保持字段为纯JSON。也许你能找到类似的东西。
  • 请看看这是否对您有帮助:msdn.microsoft.com/en-us/library/bb943471(v=vs.110).aspx
  • 移除子节点作为序列化候选者,添加新属性 childrenstring 或类似名称,让 childrenstring 的 get 属性从子节点列表中返回一个字符串。
  • @KubaWyrostek,我不介意使用不同的库,有 JSON.net 的示例代码吗?我可能喜欢将字段保持为纯 JSON。谢谢!!哦,您的第二个建议链接并不是我所需要的,因为我必须解析孩子。我不需要解析孩子。
  • @TravisJ,听起来很有趣,你能提供工作示例代码吗?谢谢

标签: c# json serialization


【解决方案1】:

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

【讨论】:

  • 完美!,正是我想要的。标记为答案。
【解决方案2】:

根据我对您问题的理解,您可以使用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));
        }
    }
}

【讨论】:

  • 感谢您的贡献。在这种情况下,另一个答案对我来说非常适合。我希望其他人会发现您的回答很有用。
  • 我很高兴你知道了。老实说,我更喜欢 Kuba Wyrostek 的回答。
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多