Изменить формат вывода JSON в файл?

Если вы хотите удалить все объекты, не входящие в коллекцию, вам нужно найти значения ключей для строк, которые вы хотите удалить. Вот пример:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ef6Test
{
    public class Blog
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

    public class BlogDbContext : DbContext
    {
        public BlogDbContext() : base("BlogDbContext") { }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }


    class DbInitializer : DropCreateDatabaseAlways<BlogDbContext>
    {
        protected override void Seed(BlogDbContext context)
        {
            base.Seed(context);
            for (int i = 0; i < 100; i++)
            {
                var b = new Blog() { Name = $"Blog {i}" };
                for (int j = 0; j < 10; j++)
                {
                    var p = new Post() { Blog = b, Content = $"Content {i} {j}" };
                    context.Posts.Add(p);
                }
                context.Blogs.Add(b);
                context.SaveChanges();
            }

        }
    }
    class Program
    {


        static void Main(string[] args)
        {
            Database.SetInitializer(new DbInitializer());

            //get an untracked Blog with its Posts
            Blog blog;
            using (var db = new BlogDbContext())
            {
                blog = db.Blogs.Include(b => b.Posts).AsNoTracking().First();

            }

            //remmove some posts
            int i = 0;
            foreach (var p in blog.Posts.ToList())
            {
                i++;
                if (i%2 == 0)
                {
                    blog.Posts.Remove(p);
                }
            }


            //delete the posts that have been removed
            using (var db = new BlogDbContext())
            {
                var postIdsToKeep = blog.Posts.Select(p => p.Id);
                var postIdsToDelete = from p in db.Posts.AsNoTracking()
                                    where p.BlogId == blog.Id
                                    where !postIdsToKeep.Contains(p.Id)
                                    select p.Id;

                //construct key-only entities for the Posts to be deleted
                foreach (var pid in postIdsToDelete)
                {
                    var p = new Post() { Id = pid };
                    db.Entry(p).State = EntityState.Deleted;
                }

                db.Database.Log = m => Console.WriteLine(m);
                db.SaveChanges();
            }
            Console.ReadKey();

        }
    }
}
1
задан a_horse_with_no_name 21 January 2019 в 21:18
поделиться

2 ответа

Вы можете использовать опции json_encode() JSON_PRETTY_PRINT:

json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);

редактировать:

, если вы используете Windows, вам нужно изменить возврат каретки, используя что-то вроде этого:

$myArray = array("test" => "data");

$buffer = json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);

echo str_replace("\n", "\r\n", $buffer);
// or
$fp = fopen('resultsv2.json', 'w');
fwrite($fp, str_replace("\n", "\r\n", $buffer));
fclose($fp);

Если вы печатаете это в браузере, вам нужно использовать <pre> теги

<pre>
echo json_encode($myArray,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
</pre>
0
ответ дан rxw 21 January 2019 в 21:18
поделиться

Следующий код должен достичь того, что вы пытаетесь сделать. Этот код был протестирован на моем компьютере и, кажется, работает отлично.

<?php $mysqli = new mysqli('localhost', 'root', 'xxxx', 'xxxx');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
    $current_row_number = 0;

    $output = "[";
    while ($row = $result->fetch_object()) {
        if ($current_row_number > 0) {
            $output = $output . ","; //add comma between each row
        }

        $output = $output . "[" . $row->KleurL . "," . $row->Datum . "]"; //add each row

        $current_row_number++;
    }
    $output = $output . "]";

    echo $output;

    $fp = fopen('resultsv2.json', 'w');
    fwrite($fp, $output);
    fclose($fp);
}

$result->close();
$mysqli->close();

Если вы хотите правильно отформатировать вывод, используйте следующий код:

<?php $mysqli = new mysqli('localhost', 'root', '244466666', 'tkd');
if ($result = $mysqli->query("SELECT CONCAT(Datum , ' ', Tijd) as Datum, KleurL FROM metingen order by Datum ASC limit 20")) {
    $current_row_number = 0;

    $output = "[";
    while ($row = $result->fetch_object()) {
        if ($current_row_number > 0) {
            $output = $output . ","; //add comma between each row
        }

        $output = $output . "\n\t" . "[" . "\n\t\t" . $row->KleurL . "," . "\n\t\t" . $row->Datum . "\n\t" . "]"; //add each row

        $current_row_number++;
    }
    $output = $output . "\n]";

    // echo $output; //if you want to see the output in the terminal/command prompt
    echo "<pre>" . $output . "</pre>"; //if you want to see the output in a browser

    $fp = fopen('resultsv2.json', 'w');
    fwrite($fp, $output);
    fclose($fp);
}

$result->close();
$mysqli->close();
0
ответ дан Tanmoy Krishna Das 21 January 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: