Список значений ключей, созданный из Json, преобразовать обратно в Json - PullRequest
0 голосов
/ 05 апреля 2020

Я использовал некоторый код для преобразования различных файлов Json в список значений ключей. Теперь мне нужно иметь возможность отменить процедуру и воссоздать оригинал Json. Ниже показан пример некоторого Json и кода, который создает пары ключ-значение.

Мои вопросы: есть ли библиотека Json, которая преобразует список значений ключа обратно в json или будет ли процесс синтаксическим анализом каждого ключа и воссозданием каждого элемента Json?

Примечание: это не вопрос о том, как создать список из Json, так как список мне уже будет предоставлен. Вопрос в том, как преобразовать список обратно в Json. Ниже приведен пример столь случайного Json, в моей работе будут использованы аналогичные Json с вложенными коллекциями и т.д. c.

Оригинал Json:

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    },
    {
      "type": "mobile",
      "number": "123 456-7890"
    }
  ],
  "children": [],
  "spouse": null
}

Json для вывода списка значений ключа:

enter image description here

Код, который выполняет преобразование Json в список:

static void Main()
{
    var json = File.ReadAllText(@"c:\temp\test.txt");
    var obj = JObject.Parse(json);

    var result = obj.Descendants()
                    .OfType<JProperty>()
                    .Select(p => new KeyValuePair<string, object>
                (p.Path, p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
                        ? null : p.Value));

    var keyValueResult = result.ToDictionary(x => x.Key, x => x.Value);

    Console.ReadLine();
}

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020

Библиотека, которую я предпочитаю: Json. Net от NewtonSoft https://www.newtonsoft.com/json

Затем вы можете опубликовать свой JSON в этом инструменте: http://json2csharp.com/

Это сгенерирует ваши C# классы для вас следующим образом:

public class Address
{
    public string streetAddress { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    public string postalCode { get; set; }
}

public class PhoneNumber
{
    public string type { get; set; }
    public string number { get; set; }
}

public class RootObject
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public bool isAlive { get; set; }
    public int age { get; set; }
    public Address address { get; set; }
    public List<PhoneNumber> phoneNumbers { get; set; }
    public List<object> children { get; set; }
    public object spouse { get; set; }
}

Затем вы читаете и повторно сериализуете свой JSON следующим образом:

var json = File.ReadAllText(@"c:\temp\test.txt");
RootObject ro = JsonConvert.DeserializeObject<RootObject>(json);

Затем для сериализации вы делаете это:

string json = JsonConvert.SerializeObject(RootObject );

Это делает это намного проще.

0 голосов
/ 05 апреля 2020

Вы можете использовать Json. Net, если у вас есть возможность сериализовать и десериализовать ваш объект hein с помощью JSONCONVERT

0 голосов
/ 05 апреля 2020

Вы можете использовать JObject для доступа к значению с помощью клавиши

         string json = @"{
  'channel': {
    'title': 'James Newton-King',
    'link': 'http://james.newtonking.com',
    'description': 'James Newton-King\'s blog.',
    'item': [
      {
        'title': 'Json.NET 1.3 + New license + Now on CodePlex',
        'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'CodePlex'
        ]
      },
      {
        'title': 'LINQ to JSON beta',
        'description': 'Announcing LINQ to JSON',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'LINQ'
        ]
      }
    ]
  }
}";

JObject rss = JObject.Parse(json);

string rssTitle = (string)rss["channel"]["title"];
// James Newton-King

string itemTitle = (string)rss["channel"]["item"][0]["title"];
// Json.NET 1.3 + New license + Now on CodePlex

JArray categories = (JArray)rss["channel"]["item"][0]["categories"];
// ["Json.NET", "CodePlex"]

IList<string> categoriesText = categories.Select(c => (string)c).ToList();
// Json.NET
// CodePlex

. Вы можете найти больше здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...